触发器是与表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合
创建触发器
创建触发器的语法如下:
create trigger trigger_name
trigger_time trigger_event on tbl_name
FOR EACH ROW
trigger_stmt
注意:触发器只能创建在永久表(Permanent Table)上,不能对临时表(Temporary Table)创建触发器
其中 trigger_time
是触发器的触发时间,可以是 before 或者 after,before 的含义指在检查约束前触发,而 after 是在检查约束后触发
而 trigger_event
就是触发器的触发事件,可以是 insert,update 或者 delete
对同一个表相同触发时间的相同触发事件,只能定义一个触发器
使用别名 old
和 new
来引用触发器中发生变化的记录内容
删除触发器
一次可以删除一个触发程序,如果没有指定 schema_name
,默认为当前数据库,具体语法如下:
drop trigger [schema_name.]trigger_name
查看触发器
可以通过执行 show triggers
命令查看触发器的状态,语法等信息
另外一个查看方式是查询系统表的 information_schema.triggers
表
触发器的使用
触发器执行的语句有以下两个限制
- 触发程序不能调用将数据返回客户端的存储程序,也不能使用采用 call 语句的动态 SQL语句,但是允许存储程序通过参数将数据返回触发程序。也就是存储过程或者函数通过 out 或者 inout 类型的参数将数据返回触发器是可以的,但是不能调用直接返回数据的过程
- 不能在触发器中使用以显式或隐式方式开始或结束事务的语句,如 start transaction,commit 或 rollback
MySQL 的触发器是按照 before 触发器,行操作,after 触发器的顺序执行的,其中任何一步操作发生错误都不会继续执行剩下的操作。如果是对事务表进行的操作,那么会整个作为一个事务被回滚(Rollback),但是如果是对非事务表进行的操作,那么已经更新的记录将无法回滚,这也是设计触发器的时候需要注意的问题