| 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在执行 |