MySQL--触发器

---恢复内容开始---

MySQL 从5.0.2版本开始支持触发器的功能。

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

触发器的这种特性可以协助应用在数据库端确保数据的完整性。

1) 创建触发器

      CREATE TRIGGER trigger_name

      trigger_time trigger_event

      ON tbl_name

      FOR EACH ROW trigger stmt

      触发器只能创建在永久表上(Permanent Table),不能对临时表(Temporary Table)创建触发器。

      trigger_time: 触发器的触发时间。可以是 BEFORE 或者 AFTER。

          BEFORE: 检查约束前触发

          AFTER:  检查约束后触发

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

          INSERT

          UPDATE

          DELETE

      使用 OLD 和 NEW 来引用触发器中发生变化的记录内容,这与其他的数据库是相似的。

      MySQL 目前还支持行级触发,不支持语句级触发。

      

      

 1 DELIMITER $$
 2 
 3 CREATE TRIGGER syn
 4 after INSERT
 5 ON t1
 6 FOR EACH ROW 
 7 BEGIN
 8     
 9     INSERT INTO t2
10     (no, name, memo)
11     VALUES
12   (new.no, new.name, 'trigger style');
13 
14 END;
15 
16 $$
17 
18 DELIMITER ;

      

      

      对于 INSERT INTO ... ON DUPLICATE KEY UPDATE ... 语句来说

        对于有重复记录、需要进行 UPDATE 操作的 INSERT,触发器触发的顺序是 BEFORE INSERT、BEFORE UPDATE、AFTER UPDATE

        对于没有重复记录的I INSERT,就是简单的执行 INSERT 操作,触发器触发的顺序是 BEFOR INSERT、AFTER INSERT

        对于那些实际执行 UPDATE 操作的记录,仍然会执行 BEFORE INSERT 触发器的内容,在设计触发器的时候一定要考虑这种情况,避免错误的触发触发器

2) 删除触发器

  一次可以删除一个触发程序,如果没有指定 schema_name,默认为当前数据库,具体语法如下  

      DROP TRIGGER [schema_name.]trigger_name

3) 查看触发器

  查看触发器的状态、语法等信息,但是不能查询指定的触发器

      SHOW TRIGGERS

  查询指定的触发器,通过查询系统表的 information_schema.triggers 表

      SELECT * FROM triggers WHERE trigger_name='trigger_name'

4) 触发器的使用

  触发器执行的语句有一下两个限制。

    触发程序不能调用将数据返回客户端的存储程序,也不能使用采用 CALL 语句的动态 SQL 语句,但是允许存储程序通过参数将数据返回触发程序。也就是存储过程或者函数通过 OUT 或者 INOUT 类型的参数将数据返回触发器是可以的,但是不能调用直接返回数据的过程。

    不能再触发器中使用以显式或隐式方式开始或结束事务的语句,如 START TRANSACTION、COMMIT 或 ROLLBACK。

  MySQL 的触发器是按照 BEFORE 触发器、行操作、AFTER 触发器的顺序执行的,其中任何一步操作发生错误都不会继续执行剩下的操作。如果是对事务表进行的操作,那么会整个作为一个事务被回滚,但是如果是对事务表进行的操作,那么已经更新的记录将无法回滚,这也是设计触发器的时候需要注意的问题。

原文地址:https://www.cnblogs.com/microcat/p/6647074.html