mysql5新添加的功能。
1 创建基本语法:
create trigger trigger_name trigger_time trigger_event
on table_name for each row trigger_stmt
trigger_name:自行定义触发器名字;
trigger_time:标识触发时机,before 或 after;
trigger_event:标识触发事件,insert,update 或 delete;
table_name:标识建立触发器的表名;
trigger_stmt:触发器程序体,可用begin和end作为开始和结束。
2 实例(a copy)
CREATE /*!50017 DEFINER = 'root'@'localhost' */ TRIGGER trig_useracct_update
AFTER UPDATE
ON SF_User.useracct FOR EACH ROW
BEGIN
IF OLD.ulevelid = 10101 OR OLD.ulevelid = 10104 THEN
IF NEW.ulevelid = 10101 OR NEW.ulevelid = 10104 THEN
if NEW.ustatid != OLD.ustatid OR NEW.exbudget != OLD.exbudget THEN
INSERT into FC_Output.fcevent set type = 2, tabid = 1, level = 1, userid = NEW.userid, ustatid = NEW.ustatid, exbudget = NEW.exbudget;
end if;
ELSE
INSERT into FC_Output.fcevent set type = 1, tabid = 1, level = 1, userid = NEW.userid, ustatid = NEW.ustatid, exbudget = NEW.exbudget;
END IF;
END IF;
END;
关键字old/new:表示修改前和修改后的列值。old列只读,new列可在触发器程序中再次赋值。
注意:begin和end之间通常使用顺序、判断和循环等语句,用来实现一般程序需要的逻辑功能。如果是简单的 insert/update/delete语句,就不需要 begin和end了。
3 查看触发器的 基本语法
show triggers from database_name like "usermaps%" //查看数据库中名字和usermaps匹配的触发器
或者
show triggers //查看所有的触发器,适用于不了解触发器信息并且触发器不多的情况下
另外,mysql中有一个information_schema.TRIGGERS表,存储所有库中的触发器
desc information_schema.TRIGGERS //查看。然后通过触发器的不同属性进行查询。
select * from information_schema. TRIGGERS where TRIGGER_NAME= 'trig_useracct_update'\G;
4 删除触发器
drop trigger [schema_name.]trigger_name
5 触发的类型
before/after * insert/update/delete=6
在一个表上最多建6个触发器。
另外注意,mysql定义的load data和replace语句也会引起上述触发器的触发。
load data语句用于将一个文件装入到一个数据表中,相当于一系列insert操作;replace=delete语句(删除与插入数据相同索引的数据)+insert语句
也就是:
Insert型触发器:可能通过insert语句,load data语句,replace语句触发;
Update型触发器:通过update语句触发;
Delete型触发器:可能通过delete语句,replace语句触发。
6 更多(有待实践)
1) mysql的引擎室innoDB,由此建立的表都是事务性表。对于事务性表,如果触发程序失败(以及由此导致的整个语句的失败),该语句所执行的所有更改将 回滚。那么,
如果before触发器执行失败,sql也会执行失败;
如果sql在执行失败时,after型触发器不会执行;
如果after触发器执行失败,sql会回滚。
2) mysql触发器程序执行的顺序
3) mysql的bin-log模式和数据库同步