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:触发时间。有两种取值:
AFTER
和BEFORE
,表明在每一行被修改的之后或之前触发动作。 - 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对同一个表相同触发时间的相同触发事件, 只能定义一个触发器。
使用别名 OLD
和 NEW
来引用触发器中发生变化的记录内容。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