1.


触发器是一个特殊的存储过程,不同的是存储过程要用CALL来调用,而触发器不需要使用CALL也不需要手工启动,只要当一个预定义的事件发生的时候,就会被MYSQL自动调用。


触发器可以让你在执行INSERT,UPDATE或者DELETE的时候,执行一些特定的操作,可以在MYSQL中指定实在SQL语句执行前触发还是执行后出发。比如说记录用户每次修改一次数据库的日志。就可以创建触发器在AFTER UPDATE后自动执行插入记录,所以触发器可以简化数据库操作,也可以用来维护数据库数据的一致性,对数据库的维护有着很重要的作用。


2. MYSQL触发器的注意事项


(1)对于每一个表的每一个事件的触发,最多只能定义一个触发器,比如说你不能定义两个AFTER INSERT的触发器,但是可以定义其他的触发点的触发器。


(2)MYSQL只支持“基于行的触发”,也就是说触发器始终是针对一条记录的,如果变更的数据集非常大,效率会很低。


(3)触发器并不一定能够保证更新的原子性。


(i)在更新MYISAM的表时,如果遇到错误是不会回滚的。


(ii)在更新INNODB的表时,由于触发器是在同一事务中完成,所以它们的执行操作是原子的(MYISAM与INNODB之间的区别可以看我的博客中博文有对此的具体介绍)


3. 触发器的具体应用实例


场景:假设系统中有两个表:


班级表 class(班级号 classID, 班内学生数 stuCount)

mysql触发器修改字段没触发 mysql触发器写法_数据库

学生表 student(学号 stuID, 所属班级号 classID)

mysql触发器修改字段没触发 mysql触发器写法_存储过程_02

要创建触发器来使班级表中的班内学生数随着学生的添加自动更新,代码如下:

mysql触发器修改字段没触发 mysql触发器写法_触发器_03

当我们插入一条学生ID为8,班级ID为2的纪录就可以看到对应班级表中编号为2的学生数增加了一位。

mysql触发器修改字段没触发 mysql触发器写法_触发器_04