设为首页 加入收藏

TOP

数据库触发器详解(二)
2014-11-24 03:21:17 来源: 作者: 【 】 浏览:7
Tags:数据库 触发器 详解
| NULL | |
| ACTION_REFERENCE_NEW_TABLE | varchar(64) | YES | | NULL | |
| ACTION_REFERENCE_OLD_ROW | varchar(3) | NO | | | |
| ACTION_REFERENCE_NEW_ROW | varchar(3) | NO | | | |
| CREATED | datetime | YES | | NULL | |
| SQL_MODE | longtext | NO | | | |
| DEFINER | longtext | NO | | | |
+----------------------------+--------------+------+-----+---------+-------+

这样,用户就可以按照自己的需要,查看触发器,比如使用如下语句查看上述触发器:

select * from information_schema. TRIGGERS where TRIGGER_NAME= 'trig_useracct_update'\G;

删除触发器。删除触发器语法如下:

DROP TRIGGER [schema_name.]trigger_name

2.2 Msyql触发器的trigger_time和trigger_event

现在,重新注意到trigger_time和trigger_event,上文说过,trigger_time可以用before和after替换,表示触发器程序的执行在sql执行的前还是后;trigger_event可以用insert,update,delete替换,表示触发器程序在什么类型的sql下会被触发。

在一个表上最多建立6个触发器,即1)before insert型,2)before update型,3)before delete型,4)after insert型,5)after update型,6)after delete型。

触发器的一个限制是不能同时在一个表上建立2个相同类型的触发器。这个限制的一个来源是触发器程序体的“begin和end之间允许运行多个语句”(摘自 mysql使用手册)。

另外还有一点需要注意,msyql除了对insert,update,delete基本操作进行定义外,还定义了load data和replace语句,而load data和replace语句也能引起上述6中类型的触发器的触发。

Load data语句用于将一个文件装入到一个数据表中,相当与一系列insert操作。replace语句一般来说和insert语句很像,只是在表中有primary key和unique索引时,如果插入的数据和原来primary key和unique索引一致时,会先删除原来的数据,然后增加一条新数据;也就是说,一条replace sql有时候等价于一条insert sql,有时候等价于一条delete sql加上一条insert sql。即是:
Insert型触发器:可能通过insert语句,load data语句,replace语句触发;
Update型触发器:可能通过update语句触发;
Delete型触发器:可能通过delete语句,replace语句触发;

3 Mysql触发器的执行顺序

先抛出触发器相关的几个问题

3.1 如果before类型的触发器程序执行失败,sql会执行成功吗?

实验如下:

1)在FC_Word.planinfo中建立before触发器:

DELIMITER |
create trigger trigger_before_planinfo_update
before update
ON FC_Word.planinfo FOR EACH ROW
BEGIN
insert into FC_Output.abc (planid) values (New.planid);
END
|

2)查看:mysql> select showprob from planinfo where planid=1;

+----------+
| showprob |
+----------+
| 2 |
+----------+

3)执行sql:

update planinfo set showprob=200 where planid=1; 触发触发器程序;

4)由于不存在FC_Output.abc,before触发器执行失败,提示:

ERROR 1146 (42S02): Table 'FC_Output.abc' doesn't exist

5)再次查看:

mysql> select showprob from planinfo where planid=1;
+----------+
| showprob |
+----------+
| 2 |
+----------+

即修改sql未执行成功。即如果before触发器执行失败,sql也会执行失败。

3.2 如果sql执行失败,会执行after类型的触发器程序吗?

实验如下:

1)在FC_Word.planinfo中建立after触发器:

DELIMITER |
create trigger trigger_after_planinfo_update
after update
ON FC_Word.planinfo FOR EACH ROW
BEGIN
INSERT INTO FC_Output.fcevent set level = 2, type = 2, tabid = 5, userid = NEW.userid, planid = NEW.planid, planstat2 = NEW.planstat2, showprob = NEW.showprob, showrate = NEW.showrate, showfactor = NEW.showfactor, planmode = NEW.planmode;
END
|

2)查看触发表:

mysql> select * from FC_Output.fcevent where planid=1;
Empty set (0.00 sec)

没有planid=1的记录

3)执行sql:

mysql> update planinfo set showprob1=200 where planid=1;

4)由于不存在showprob1列,提示错误:

ERROR 1054 (42S22): Unknown column 'showprob1' in 'field list'

5)再次查看触发表:

mysql> select * from FC_Output.fcevent where planid=1;
Empty set (0.00 sec)

触发表中没有planid=1的记录,sql在执行
首页 上一页 1 2 3 4 5 下一页 尾页 2/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇mysql grant命令详解 下一篇MYSQL操作命令

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Java 编程和 c 语言 (2025-12-25 08:19:48)
·. net内存管理宝典这 (2025-12-25 08:19:46)
·C++为什么不加上内存 (2025-12-25 08:19:44)
·MySQL 安装及连接-腾 (2025-12-25 06:20:28)
·MySQL的下载、安装、 (2025-12-25 06:20:26)