触发器 trigger

触发器是与表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合。

顾名思义,就是由事件触发的语句 "*´∀)*´∀)*´∀)\*´∀)"

特性

  1. 有 begin end 体,执行的语句需要填写在其中
  2. 触发条件:可以是I,D,U(增删改)
  3. 触发时间:在增删改前后
  4. 每一条语句触发执行
  5. 触发器定义在表上,附着在表上

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,用来表示触发器的所在表中,触发了触发器的那一行数据,来引用触发器中发生变化的记录内容,具体地:

  1. INSERT 型触发器中,NEW 用来表示将要(BEFORE)或已经(AFTER)插入的新数据;
  2. UPDATE 型触发器中,OLD 用来表示将要或已经被修改的原数据,NEW 用来表示将要或已经修改为的新数据;
  3. DELETE 型触发器中,OLD 用来表示将要或已经被删除的原数据;

使用方法

NEW.columnNamecolumnName 为相应数据表某一列名)

另外,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