MySQL的触发器

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)

但是对非事务表进行操作,那么已经更新的记录将无法回滚

猜你喜欢

转载自blog.csdn.net/HNDX2018/article/details/82976773