Skip to content

18. MySQL触发器

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

1. 创建触发器

CREATE
    [DEFINER = { user | CURRENT_USER }]
    TRIGGER trigger_name trigger_time trigger_event
    ON tbl_name FOR EACH ROW trigger_body

trigger_time: { BEFORE | AFTER }

trigger_event: { INSERT | UPDATE | DELETE }
  • trigger_time:触发时间。有两种取值:AFTERBEFORE,表明在每一行被修改的之后或之前触发动作。
  • trigger_event:触发的语句类型。
    • INSERT:不论什么方式的记录插入都会触发。
    • UPDATE:不论什么方式的记录更新都会触发。
    • DELETE:不论什么方式的记录删除都会触发。但是DROP TABLE 、 TRUNCATE TABLE 和 Dropping a partition不会触发,因为它们没有使用DELETE语句。
  • trigger_body :触发器执行的语句。可使用BEGIN...END语句。

注意

  • 触发器只能创建在永久表(Permanent Table)上,不能对临时表(Temporary Table)创建触发器。
  • 只有使用SQL语句触发的修改才会激活触发器;对于不将SQL语句传输到MySQL服务器的API所做的更改,触发器不会激活。
  • 级联的外键操作不会激活触发器
  • 不能在触发器中使用以显式或隐式方式开始或结束事务的语句, 如 START TRANSACTION、COMMIT 或 ROLLBACK。

MySQL对同一个表相同触发时间的相同触发事件, 只能定义一个触发器。

使用别名 OLDNEW 来引用触发器中发生变化的记录内容。DELETE事件只能使用OLD.col_name(只读的),INSERT事件只能使用NEW.col_name 。在BEFORE类型的触发器中,自增字段的值是0。而不是实际插入的值。

MariaDB [MYISAM_TEST]> SET @count_test = 0;

MariaDB [MYISAM_TEST]> delimiter //

MariaDB [MYISAM_TEST]> CREATE TRIGGER insert_test AFTER INSERT ON TEST FOR EACH ROW BEGIN SET @count_test = @count_test + 1; END //

MariaDB [MYISAM_TEST]> CREATE TRIGGER update_test AFTER UPDATE ON TEST FOR EACH ROW BEGIN SET @update_id_test = NEW.id;END//

MariaDB [MYISAM_TEST]> delimiter ;

2. 查看触发器

-- 查询当前数据的触发器
SHOW TRIGGERS [{FROM | IN} db_name]
    [LIKE 'pattern' | WHERE expr]
-- LIKE 匹配的是表的名字

-- 在information_schema数据库中的TRIGGERS表查询
MariaDB [information_schema]> DESC TRIGGERS;

3. 删除触发器

DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name