MySQL 触发器

介绍

对表进行「增删改」 之前(或之后)被触发,自动执行一段事先写好的 SQL 代码

创建语法

delimiter $$ # 告诉程序使用 $$ 作为结束分隔符

CREATE TRIGGER [触发器的名字]
[触发器执行时机] [触发器监测的操作]
ON [表名]
FOR EACH ROW [触发器主体代码]//

$$ # 表示创建存储过程结束

解释:

  • [触发器执行时机]:

    • before:设置触发器是在关键动作执行之前触发
    • after:设置触发器是在关键动作执行之后触发
  • [触发器监测的操作]:触发器可以监测 INSERTUPDATEDELETE 操作,当监测的命令对触发器关联的表进行操作时,触发器就被激活了

  • [表名]:表示对改变进行操作。如果这个表被删除了,那么这个触发器也随之被删除。

  • FOR EACH ROW:这句表示只要满足触发器触发条件,触发器都会被执行,也就是说带上这个参数后,触发器将监测每一行对关联表操作的代码,一旦符合条件,触发器就会被触发。

  • [触发器主体代码]:这里是当满足触发条件后,被触发执行的代码主体。这里可以是一句 SQL 语句,也可以是多行命令。如果是多行命令,那么这些命令要写在 BEGIN…END 之间。

举例说明

BEFORE INSERT ON emp: 对 emp 表执行 insert 后,执行触发器。

AFTER INSERT ON emp: 对 emp 表执行 insert 后,执行触发器。可以通过 new 获取新插入的字段值

BEFORE UPDATE ON emp :对 emp 表执行 UPDATE 前,执行触发器。

AFTER UPDATE ON emp:对 emp 表执行 UPDATE 后,执行触发器。可以通过 old 获取更新前的字段值,通过 new 获取更新后的字段值

BEFORE DELETE ON emp:对 emp 表执行 DELETE 前,执行触发器。

AFTER DELETE ON emp:对 emp 表执行 DELETE 后,执行触发器。可以通过 old 获取删除的字段值

例子

dept 表中增加 count 字段,int 类型,表示该部门的员工数量,那么添加员工、删除员工、员工从一个部门调入另一个部门时,要更新 dept 表的 count 字段,分以下情况:

  1. 每次向 emp 表中添加员工时,要同步让该部门的 count 字段加1

  2. 每次向 emp 表中删除员工时,要同步让该部门的 count 字段减1

  3. 如果员工从一个部门调到另一个部门,即 emp 表中的 deptno 修改了,那么 dept 表调出部门的 count 字段减1,调入部门的 count 字段加1

第一种情况的触发器:

CREATE TRIGGER tri_emp_insert AFTER INSERT ON emp FOR EACH ROW
UPDATE dept SET COUNT = COUNT+1 WHERE deptno = new.deptno

第二种情况的触发器:

CREATE TRIGGER tri_emp_delete AFTER DELETE ON emp FOR EACH ROW
UPDATE dept SET COUNT = COUNT-1 WHERE deptno = new.deptno

第三种情况的触发器:

delimiter $$ # 告诉程序使用 $$ 作为结束分隔符
CREATE TRIGGER tri_emp_af_update_deptno AFTER update ON emp FOR EACH ROW
BEGIN
UPDATE dept SET COUNT = COUNT + 1 WHERE deptno = new.deptno;
UPDATE dept SET COUNT = COUNT - 1 WHERE deptno = old.deptno;
END
$$

参考:
https://blog.csdn.net/qq_54169998/article/details/122720159
https://zhuanlan.zhihu.com/p/439273702


原文出处:https://malaoshi.top/show_1IX64k91INts.html