MySQL 触发器
触发器(trigger)是MySQL提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作(insert,delete, update)时就会激活它执行。
1. 创建触发器
CREATE TRIGGER <触发器名> <触发时机 BEFORE | AFTER>
<触发事件 INSERT | UPDATE | DELETE >
ON <表名> FOR EACH Row <触发器主体>
END;
1.1 <触发器名>
触发器的名称,触发器在当前数据库中必须具有唯一性。如果要在某个特定数据库中创建,名称前面应该加上数据库的名称. 如 xxx_trigger_xxx 命名
1.2 <触发时机> BEFORE | AFTER
触发时机 BEFORE 和 AFTER,触发器被触发的时刻,表示触发器是在激活它的语句之前或之后触发。若希望验证新数据是否满足条件,则使用 BEFORE 选项;若希望在激活触发器的语句执行之后完成几个或更多的改变,则通常使用 AFTER 选项。
1.3 <触发事件> INSERT | UPDATE | DELETE
触发事件,用于指定激活触发器的语句的种类。
注意:三种触发器的执行时间如下。
触发器类型 | 触发器功能 | 激活触发器的语句 |
---|---|---|
INSERT触发器 | 将新行插入表时激活触发器。 | INSERT ,LOAD, DATA ,REPLACE |
DELETE触发器 | 从表中删除某一行数据时激活触发器。 | DELETE ,REPLACE |
UPDATE触发器 | 更改表中某一行数据时激活触发器。 | DELETE |
1.4 <表名>
与触发器相关联的表名,此表必须是永久性表,不能将触发器与临时表或视图关联起来。在该表上触发事件发生时才会激活触发器。同一个表不能拥有两个具有相同触发时刻和事件的触发器。例如,对于一张数据表,不能同时有两个 BEFORE UPDATE 触发器,但可以有一个 BEFORE UPDATE 触发器和一个 BEFORE INSERT 触发器,或一个 BEFORE UPDATE 触发器和一个 AFTER UPDATE 触发器。
1.5 <关键字 FOR EACH ROW>
一般是指行级触发,对于受触发事件影响的每一行都要激活触发器的动作。例如,使用 INSERT 语句向某个表中插入多行数据时,触发器会对每一行数据的插入都执行相应的触发器动作。
1.6 <触发器主体>
触发器动作主体,包含触发器激活时将要执行的 MySQL 语句。如果要执行多个语句,可使用 BEGIN…END 复合语句结构。
注意:每个表都支持 INSERT、UPDATE 和 DELETE 的 BEFORE 与 AFTER,因此每个表最多支持 6 个触发器。每个表的每个事件每次只允许有一个触发器。单一触发器不能与多个事件或多个表关联。
在oracle触发器中,触发器分为行触发器和语句触发器,在oracle中for each row如果不写,为语句触发器,无论update语句一次影响了多少行,都只执行一次触发事件。
NEW和OLD的使用:
触发器类型 | NEW和OLD的使用 |
---|---|
INSERT触发器 | NEW表示将要或者已经新增的数据。 |
DELETE触发器 | OLD用来表示将要或者已经被删除的语句。NEW表示将要或者已经被修改的语句 |
UPDATE触发器 | OLD表示将要或者已经被删除的数据。 |
2. 查看触发器
show triggers;
3. 删除触发器
drop trigger if EXISTS <触发器名>
4. 限制和注意事项
4.1 触发器会有以下两种限制:
-
触发程序不能调用将数据返回客户端的存储程序,也不能使用采用CALL语句的动态SQL语句,但是允许存储程序通过参数将数据返回触发程序,也就是存储过程或者函数通过OUT或者INOUT类型的参数将数据返回触发器是可以的,但是不能调用直接返回数据的过程。
-
不能再触发器中使用以显示或隐式方式开始或结束事务的语句,如START TRANS-ACTION,COMMIT或ROLLBACK。
注意事项:MySQL的触发器是按照BEFORE触发器、行操作、AFTER触发器的顺序执行的,其中任何一步发生错误都不会继续执行剩下的操作,如果对事务表进行的操作,如果出现错误,那么将会被回滚,如果是对非事务表进行操作,那么就无法回滚了,数据可能会出错。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下