什么是触发器?
触发器其实就是类似与捕鼠笼的一个东西,老鼠进了笼子,就会触发笼门落下这一事件的发生。这个事情不是由老鼠控制的,也不是由人来手动启动的,而是老鼠进入捕鼠笼这件事情来触发的。专业一点的说法就是
触发器(trigger)是MySQL提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作(insert,delete, update)时就会激活它执行。简单理解为:你执行一条sql语句,这条sql语句的执行会自动去触发执行其他的sql语句。
触发器可以干什么?
在指定表上,(insert(插入)、update(更新)、delete(删除))事件动作,触发(After(之后)时机,Before(之前)),执行指定的一群或一个sql语句。
- 可在写入数据表前,强制检验或转换数据。
- 触发器发生错误时,异动的结果会被撤销。
- 部分数据库管理系统可以针对数据定义语言(DDL)使用触发器,称为DDL触发器。
- 可依照特定的情况,替换异动的指令 (INSTEAD OF)。
触发器的用法
1
2
3
4
5
CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW
BEGIN
trigger_stmt;
END;
-- 注意: 触发器也是存储过程程序的一种,而触发器内部的执行SQL语句是可以多行操作的,所以在MySQL的存储过程程序中,要定义结束符。
trigger_name
: 触发器名称,用户自行指定
trigger_time
: 触发时机,取值BEFORE(之前)、AFTER(之后)
trigger_event
: 出发事件,INSERT、UPDATE、DELETE。(插入、更新、删除)
tbl_name
: 需要建立触发器的表名
trigger_stmt
: 触发程序体,可以是一条SQL语句或是BEGIN和END包含的索条语句
由上面,可以知道MYSQL可以创建6种类型的触发器。 (BEFORE INSERT、BEFORE UPDATE、BEFORE DELETE) (AFTER INSERT、AFTER UODATE、AFTER DELETE)
触发器与存储过程的唯一区别是触发器不能执行EXECUTE语句调用,而是在用户执行Transact-SQL语句时自动触发执行。
触发器的执行顺序
触发器建立的一般是InnoDB数据库,上面要使用的表也是要事务支持的。
- 如果BEFORE触发器执行失败,SQL无法正确执行。
- SQL执行失败时,AFTER型触发器不会触发。
- AFTER类型的触发器执行失败,SQL会回滚。
触发器中的old和new
- 在触发目标上执行insert操作后会有一个新行,如果在触发事件中需要用到这个新行的变量,可以用new关键字表示
- 在触发目标上执行delete操作后会有一个旧行,如果在触发事件中需要用到这个旧行的变量,可以用old关键字表示
- 在触发目标上执行update操作后原纪录是旧行,新记录是新行,可以使用new和old关键字来分别操作
应用场景
- 根据也业务逻辑限制某些操作
- 数据校验
- 数据的同步和备份
最后
触发器在实际情况用到的是很少的,推荐使用存储过程程序。