一、简介  

1、触发器是MySQL响应DELETE、INSERT、UPDATE语句而自动执行的一条MySQL语句(或位于BEGIN和END语句之间的一组语句),其他MySQL语句不支持触发器。

2、创建触发器时,需要给出4条信息:唯一的触发器名;触发器关联的表;触发器应该响应的活动(DELETE、INSERT、UPDATE);触发器何时执行(处理之前或之后)。

3、只有表才支持触发器

3、触发器按每个表每个事件每次地定义,每个表每个事件每次只允许一个触发器。因此,每个表最多支持6个触发器(每条DELETE、INSERT、UPDATE的之前和之后)。单一触发器不能与多个表关联,所以,如果需要一个对INSERT和UPDATE操作执行的触发器,则应该定义2个触发器。

4、触发器失败:如果BEFORE触发器失败,则MySQL将不执行请求的操作。此外,如果BEFORE触发器或语句本身失败,则MySQL将不执行AFTER触发器(如果有的话)。

5、触发器用CREATE TRIGGER语句创建。一个简单的例子:

1 CREATE TRIGGER insert_product_after AFTER INSERT ON products
2 FOR EACH ROW SELECT 'product added' INTO @var;

  如果直接SELECT,不把结果放在一个变量中的话,会报错"Not allowed to return a result set from a trigger"。在MySQL的trigger和function中不能出现select * from table形式的查询,因为其会返回一个结果集;结果集在MySQL的trigger和function中是不可接受的。

  CREATE TRIGGER创建了一个名为insert_product_after的触发器,这个触发器在INSERT语句成功执行后执行。这个触发器指定了FOR EACH ROW,因此代码对每个插入行执行。

6、触发器删除使用DROP TRIGGER语句,如下所示:

1 DROP TRIGGER insert_product_after;

  触发器不能更新或覆盖。为了修改一个触发器,必须先删除它,然后再重新创建。

 

二、INSERT触发器

1、在INSERT触发器代码内,可引用一个名为NEW的虚拟表,访问被插入的行。

2、在BEFORE INSERT触发器中,NEW中的值也可以被更新(允许更改被插入的值)。

3、对于AUTO_INCREMENT列,NEW在INSERT执行之前包含0,在INSERT执行之后包含新的自动生成值。

1 CREATE TRIGGER neworder AFTER INSERT ON orders
2 FOR EACH ROW SELECT NEW.order_num INTO @var;

  测试上述触发器的例子:

 

三、DELETE触发器

 1、在DELETE触发器代码内,可以引用一个名为OLD的虚拟表,访问被删除的行。

2、OLD中的值全部都是只读的,不能更新。

3、一个演示使用OLD保存将要被删除的行到一个存档表中。

1 DELIMITER //
2 CREATE TRIGGER deleteorder BEFORE DELETE ON orders
3 FOR EACH ROW
4 BEGIN
5     INSERT INTO record_orders(order_num, order_date, cust_id)
6     VALUES(OLD.order_num, OLD.order_date, OLD.cust_id);
7 END//

 

四、UPDATE触发器

1、在UPDATE触发器代码中,你可以引用一个名为OLD的虚拟表访问以前(UPDATE语句前)的值,引用一个名为NEW的虚拟表访问新更新的值。

2、在BEFORE UPDATE触发器中,NEW中的值也可能被更新(允许更改将要用于UPDATE语句中的值)

3、OLD中的值全都是只读的,不能更新。

4、一个例子将名字缩写改为大写

1 CREATE TRIGGER update_vendor BEFORE UPDATE ON vendors
2 FOR EACH ROW SET NEW.vend_state = UPPER(NEW.vend_state);

 

posted on 2018-12-16 23:10  acgame  阅读(352)  评论(0编辑  收藏  举报