MySQL 触发器 作者:马育民 • 2023-08-19 08:12 • 阅读:10030 # 介绍 对表进行「增删改」 之前(或之后)被触发,自动执行一段事先写好的 SQL 代码 # 创建语法 ``` delimiter $$ # 告诉程序使用 $$ 作为结束分隔符 CREATE TRIGGER [触发器的名字] [触发器执行时机] [触发器监测的操作] ON [表名] FOR EACH ROW [触发器主体代码]// $$ # 表示创建存储过程结束 ``` 解释: - [触发器执行时机]: - before:设置触发器是在关键动作执行之前触发 - after:设置触发器是在关键动作执行之后触发 - [触发器监测的操作]:触发器可以监测 `INSERT`、`UPDATE`、`DELETE` 操作,当监测的命令对触发器关联的表进行操作时,触发器就被激活了 - [表名]:表示对改变进行操作。如果这个表被删除了,那么这个触发器也随之被删除。 - 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 原文出处:http://malaoshi.top/show_1IX64k91INts.html