MYSQL触发器
一. 触发器概念
- 作用:在通过sql对表进行插入,更新,删除操作的时候自动执行触发器中的sql语句对数据进行进一步操作
- 分类:
- DML(数据库操作语言)
- after触发器(之后触发)
- insert触发器
- update触发器
- delete触发器
- before触发器(之前触发)
- insert触发器
- update触发器
- delete触发器
- after触发器(之后触发)
- DML(数据库操作语言)
二. 触发器工作原理
- 触发过程:
- 触发器被触发
- 在内存中创建两张虚拟表inserted和deleted
- 根据操作表的sql语句的不同,对两张虚拟表进行相应的操作
- 触发器检查inserted和deleted表中的新数据,确定是否要回滚或者其他操作
- 不同sql语句执行时,对inserted和deleted的操作对照
操作表的sql语句 | inserted表 | deleted表 |
insert语句 | 存放新增的记录 | |
deleted语句 | 存放被删除的记录 | |
update语句 | 存放更新后的记录 | 存放更新前的记录 |
三. 触发器的创建
- 语法:
#1. 单条语句触发器 CREATE TRIGGER 触发器名 trigger_time trigger_event ON 表名 FOR EACH ROW a_trigger_stmt #2. 多条语句触发器 DELIMITER $ CREATE TRIGGER 触发器名 trigger_time trigger_event ON 表名 FOR EACH ROW BEGIN trigger_stmts END DELIMITER ;
其中:
-
trigger_time:{BEFORE | AFTER} 触发时机
-
trigger_event:{INSERT | UPDATE | DELETE} 触发事件
-
a_trigger_stmt 触发器程序体,一句SQL语句
-
trigger_stmts 触发器程序体,多条语句。
-
- 注意:一个表上不能建立两个相同类型的触发器,所以一个表最多建立六个触发器
- BEGIN...END
- DELIMITER:用来重新定义sql语句的结束符号
- 中因为其中一条结束的时候的分号会导致mysql判断整条语句结束,所以再开始的地方通过“DELIMITER 重新定义的语句结束符号”来让mysql知道在哪结束,当然,运行完需要将;在改回来,所以有了最后一句“DELIMITER ;”
- DECLARE:用来定义局部变量
- BEGIN...END中用
- 定义在BEGIN...END中所有语句的第一句
- 语法:DECLARE var_name[,...] type [DEFAULT value]
- var_name 为变量名称,同 SQL 语句一样,变量名不区分大小写;
- type 为 MySQL 支持的任何数据类型;可以同时定义多个同类型的变量,用逗号隔开;
- 变量初始值为 NULL,如果需要,可以使用 DEFAULT 子句提供默认值,值可以被指定为一个表达式
- DELIMITER:用来重新定义sql语句的结束符号
- NEW和OLD
- new和old表示触发器所在的表中,触发了触发器的那一行数据
- 其中old是只读的,而new则可以在触发器中使用set赋值
操作表的sql语句 | new | old |
insert语句 | 存放新增行数据 | |
deleted语句 | 表示被删除行数据 | |
update语句 | 表示更新后的行数据 | 表示更新前的行数据 |
- 易于理解的实例:mysql触发器商城应用
四. 管理触发器
- 查看触发器:SHOW TRIGGERS [FROM schema_name];
- 删除触发器:DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name