一、简介
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);