触发器 trigger
触发器是与表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合。
顾名思义,就是由事件触发的语句 "*´∀
)*´∀)*´∀)\*´∀)"
特性
- 有 begin end 体,执行的语句需要填写在其中
- 触发条件:可以是
I,D,U(增删改) - 触发时间:在增删改前后
- 每一条语句触发执行
- 触发器定义在表上,附着在表上
WARNING
对增删改非常频繁的表上切记不要使用触发器,触发器是针对每一行的,因为它会非常消耗资源;触发器尽量少的使用,因为不管如何,它很消耗资源,如果使用的话要谨慎的使用,至少确保语句是高效的。
格式
CREATE
[DEFINER = { user | CURRENT_USER }]
TRIGGER trigger_name
trigger_time trigger_event
ON tbl_name FOR EACH ROW
[trigger_order]
trigger_body
# trigger_time: { BEFORE | AFTER }
# trigger_event: { INSERT | UPDATE | DELETE }
# trigger_order: { FOLLOWS | PRECEDES } other_trigger_name
一条语句
CREATE TRIGGER 触发器名 BEFORE|AFTER 触发事件 ON 表名 FOR EACH ROW 执行语句;
多条语句
CREATE TRIGGER 触发器名 BEFORE|AFTER 触发事件
ON 表名 FOR EACH ROW
BEGIN
执行语句列表
END;
NEW 与 OLD
NEW 与 OLD 详解
MySQL 中定义了 NEW 和 OLD,用来表示触发器的所在表中,触发了触发器的那一行数据,来引用触发器中发生变化的记录内容,具体地:
- 在
INSERT型触发器中,NEW用来表示将要(BEFORE)或已经(AFTER)插入的新数据; - 在
UPDATE型触发器中,OLD用来表示将要或已经被修改的原数据,NEW用来表示将要或已经修改为的新数据; - 在
DELETE型触发器中,OLD用来表示将要或已经被删除的原数据;
使用方法
NEW.columnName (columnName 为相应数据表某一列名)
另外,OLD 是只读的,而 NEW 则可以在触发器中使用 SET 赋值,这样不会再次触发触发器,造成循环调用(如每插入一个学生前,都在其学号前加“🐷”)。
mysql> CREATE TRIGGER upd_check BEFORE UPDATE ON account
-> FOR EACH ROW
-> BEGIN
-> IF NEW.amount < 0 THEN
-> SET NEW.amount = 0;
-> ELSEIF NEW.amount > 100 THEN
-> SET NEW.amount = 100;
-> END IF;
-> END
查看触发器
查询所有触发器
SHOW TRIGGERS
通过information_schema.triggers 表中查看触发器信息
# 查看所有
mysql> select * from information_schema.triggers;
# 准确查找
mysql> select * from information_schema.triggers
-> where trigger_name='upd_check';
删除触发器
DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name