1. MySQL从5.0.2版本开始支持触发器的功能。
2. 创建触发器
CREATE TRIGGER trigger_name trigger_time trigger_event
ON tbl_name FOR EACH ROW trigger_stmt;
a. trigger_time: 触发时间 (BEFORE:检查约束前触发 , AFTER检查约束后触发 )
b. trigger_event: 触发时间 (INSERT, UPDATE , DELETE)
c. 注意:对同一个表相同触发时间的相同触发事件,只能定义一个触发器。
d. 使用别名 OLD和NEW 来引用触发器中发生变化的记录内容。
示例:
DELIMITER $$
CREATE TRIGGER ins_film
AFTER INSERT ON film
FOR EACH ROW
BEGIN
INSERT INTO film_test(film_id, title, description)
VALUES(new.film_id,new.tiltle, new.description);
END ;
$$
delimiter ;
3. 删除触发器
一次可以删除一个触发程序,如果没有指定schema_name ,默认为当前数据库。
DROP TRIGGER [schema_name.]trigger_name
4. 查看触发器
a. SHOW TRIGGERS \G
b. 查看指定触发器信息
select *
from information_schema.triggers
where trigger_name='ins_film_bef' \G
5. 触发器执行限制
a. 触发程序不能调用将数据返回客户端的存储程序,也不能使用采用CALL语句的动态SQL语句,但是允许存储程序通过参数将数据返回触发程序。(存储过程或者函数通过OUT 或者 INOUT 类型的参数将数据返回触发器是可以的,但是不能调用直接返回数据的过程)
b. 不能再触发器中使用以显式或隐式开始或结束事务的语句,如 START TRANS,ACTION ,COMMIT ,或 ROLLBACK
注意:
MySQL的触发器是按照BEFORE 触发器,行操作,AFTER触发器的顺序执行,其中任何一步操作发生错误都不会继续执行剩下的操作。
如果是对事务表进行的操作,那么会整个作为一个事务被回滚(ROLLBACK)
但是对非事务表进行操作,那么已经更新的记录将无法回滚