缘由:
今天加班到八点半左右的时候突然看到一篇博文,是介绍 MySQL 触发器的。这一看吓一跳。原来还有这么好玩的功能。于是乎,立马忘记了自己加班是要干嘛的。大致玩耍了一下这项骚操作。在此大致记录一下。
1.触发器简介:
触发器是和表关联的特殊的存储过程,可以在插入,删除或修改表中的数据时触发执行,比数据库本身标准的功能有更精细和更复杂的数据控制能力。触发器一张表中同一个类型只能有一个。个人认为简单来说,触发器可以类似于Spring 中的切面编程。在方法(插入,删除或修改表中的数据)执行的前后进行一些操作。不过他们的实现原理应该是不一样的(这里只是作为一个猜测,有机会的话验证一下)。具体的实现原理我还没有去了解。触发器有 NEW和OLD 的概念,下面会说。
2.创建触发器
CREATE TRIGGER trigger_name trigger_time trigger_event ON tb_name FOR EACH ROW trigger_stmt
trigger_name:触发器的名称。
tirgger_time:触发时机,为BEFORE或者AFTER。
trigger_event:触发事件,为INSERT、DELETE或者UPDATE。
tb_name:表示建立触发器的表名,在哪张表上建立触发器。
trigger_stmt:触发器的程序体,可以是一条SQL语句或者是用BEGIN和END包含的多条语句。
FOR EACH ROW表示任何一条记录上的操作满足触发事件都会触发该触发器。
如:
create trigger trigger_test
AFTER UPDATE ON department FOR EACH ROW
BEGIN
UPDATE users SET depart_name=NEW.name where depart_id = NEW.id;
END
MySQL中定义了NEW和OLD,用来表示触发器的所在表中,触发了触发器的那一行数据。
在INSERT型触发器中,NEW用来表示将要(BEFORE)或已经(AFTER)插入的新数据;
在UPDATE型触发器中,OLD用来表示将要或已经被修改的原数据,NEW用来表示将要或已经修改为的新数据;
在DELETE型触发器中,OLD用来表示将要或已经被删除的原数据;
使用方法:NEW.columnName(columnName为相应数据表某一列名)
另外,OLD是只读的,而NEW则可以在触发器中使用SET赋值,不会再次触发触发器,造成循环调用。
触发器一张表中同一个类型只能有一个。一张表中同一类型的触发器如果你想创建多个,会报如下错误。
3. 触发器执行顺序
InnoDB数据库,若SQL语句或触发器执行失败,MySQL会回滚事务,有:
A、如果BEFORE触发器执行失败,SQL无法正确执行。
B、SQL执行失败时,AFTER型触发器不会触发。
C、AFTER类型的触发器执行失败,SQL会回滚。
MySQL的触发器是按照BEFORE触发器、行操作、AFTER触发器的顺序执行的,其中任何一步发生错误都不会继续执行剩下的操作,如果对事务表进行的操作,如果出现错误,那么将会被回滚,如果对非事务表(戳这里了解非事务表)进行操作,那么就无法回滚,数据可能会出错。
目前我也只是简单地写了点小例子。浅尝辄止。参考博文中又具体的案例和优缺点描述。
参考博文: