触发器

Posted by t298 on May 16, 2021

什么是触发器?

触发器其实就是类似与捕鼠笼的一个东西,老鼠进了笼子,就会触发笼门落下这一事件的发生。这个事情不是由老鼠控制的,也不是由人来手动启动的,而是老鼠进入捕鼠笼这件事情来触发的。专业一点的说法就是

触发器(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 : 出发事件,INSERTUPDATEDELETE。(插入、更新、删除) tbl_name : 需要建立触发器的表名 trigger_stmt : 触发程序体,可以是一条SQL语句或是BEGINEND包含的索条语句

由上面,可以知道MYSQL可以创建6种类型的触发器。 (BEFORE INSERT、BEFORE UPDATE、BEFORE DELETE) (AFTER INSERT、AFTER UODATE、AFTER DELETE

触发器与存储过程的唯一区别是触发器不能执行EXECUTE语句调用,而是在用户执行Transact-SQL语句时自动触发执行。

触发器的执行顺序

触发器建立的一般是InnoDB数据库,上面要使用的表也是要事务支持的。

  1. 如果BEFORE触发器执行失败,SQL无法正确执行。
  2. SQL执行失败时,AFTER型触发器不会触发。
  3. AFTER类型的触发器执行失败,SQL会回滚。

触发器中的old和new

  • 在触发目标上执行insert操作后会有一个新行,如果在触发事件中需要用到这个新行的变量,可以用new关键字表示
  • 在触发目标上执行delete操作后会有一个旧行,如果在触发事件中需要用到这个旧行的变量,可以用old关键字表示
  • 在触发目标上执行update操作后原纪录是旧行,新记录是新行,可以使用new和old关键字来分别操作

应用场景

  1. 根据也业务逻辑限制某些操作
  2. 数据校验
  3. 数据的同步和备份

最后

触发器在实际情况用到的是很少的,推荐使用存储过程程序