mysql开发 -- 触发器

匿名 (未验证) 提交于 2019-12-02 22:06:11

MYSQL 从5.0.2版本开始支持触发器的功能,触发器是与表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性。

触发器创建语法如下:

 CREATE TRIGGER trigger_name trigger_time trigger_event  ON table_name FOR EACH ROW  BEGIN  trigger_statement  END

其中:
trigger_name 是触发器的名称。

trigger_time 是触发器的触发时间,可以是BEFORE 或是AFTER,BEFORE的含义值在检查约束前触发,AFTER 是在检查约束后触发。

trigger_envent 是触发器的触发事件。 可以是 INSERT,UPDATE ,DELETE.

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

使用别名 NEW 和OLD 来应用触发器中发送变化的记录内容。现在的触发器还只支持行级触发,不支持语句级触发。

为 film 表创建 after insert 触发器:

DELIMITER && CREATE TRIGGER ins_flim after insert ON film FOR EACH ROW BEGIN      INSERT INTO file_text(film_id , title, description) values(NEW.film_id,NEW.title,NEW.description); END; $$ DELIMITER;

一次可以删除一个触发程序,如果没有指定 SCHEMA_name 默认为当前数据库。

DROP TRIGGER [schema_name.]trigger_name;

例如要删除film表上的触发器:

drop trigger ins_flim;

可以通过

SHOW TRIGGERS

来查看触发器的状态,语法等信息。但是因为不能查询指定的触发器,所以每次都返回所有的触发器信息。
另一个查询方法是查看系统表的information_schema.triggers表,这个方式可以查询指定触发器的指定信息,操作起来方便:

    select * from triggers where trigger_name = 'ins_flim' \G;

触发器执行的语句有以下两种限制。

  • 触发程序不能调用将数据返回客户端的存储程序,也不能使用采用CALL语句的动态SQL,但是允许存储程序通过参数将数据返回触发程序。也就是存储过程或是函数通过OUT或是INOUT类型的参数,将数据返回触发器是可以的,但是不能调用直接返回数据的过程。
  • 不能再触发器中使用以显示或是隐式方式开始或结束事务的语句。

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!