创建触发器需要给出4条信息:
1. 唯一的触发器名;
2.触发器关联的表;
3.触发器应该响应的活动(D,I,U)
4.触发器何时执行(处理之前或之后)。
下面一个简单的例子
创建触发器:
CREATE TRIGGER newproduct AFTER INSERT ON products FOR EACH ROW SELECT 'Product added';
后面的SELECT语句是插入显示的功能。
需要注意的是:只要表才支持触发器,视图是不支持触发器的,临时表也不支持。并且每个表的每个事件只允许一个触发器。因此每个表最多支持6个触发器。单一触发器不能与多个事件或多个表关联,所以,如果你需要一个对INSERT和UPDATE操作执行的触发器,则应该定义两个触发器。
如果BEFORE触发器失败,则MySQL将不执行请求的操作。此外,如果BEFORE触发器或语句本身失败,MySQL将不执行AFTER触发器(如果有的话)。
删除触发器:
DROP TRIGGER newproduct;
触发器不能更新和覆盖。为了修改触发器,必须先删除它,然后在重新创建。
INSERT 触发器
1.在INSERT触发器代码内,可引用一个名为NEW的虚拟表。访问被插入的行;
2.BEFORE INSERT触发器中,NEW中的值也可以被更新(允许更改被插入的值);
3.对于AUTO_INCREMENT列,NEW在INSERT执行之前包含0,在INSERT执行之后包含新的自动生成值。
CREATE TRIGGER neworder AFTER INSERT ON orders FOR EACH ROW SELECT NEW.order_num;
是BEFORE 还是AFTER ?通常,将BEFORE用于数据验证和净化(目的是保证插入表中的数据确实是需要的数据)
DELETE触发器:
1.DELETE触发器代码内,你可以引用一个名为OLD的虚拟表。访问被删除的行;
2.OLD中的值全都是只读的,不能更新。
CREATE TRIGGER deleteorder BEFORE DELETE ON orders FOR EACH ROW
BEGIN
INSERT INTO archive_orders(order_num,order_date,cust_id) VALUES(OLD.order_num,OLD.order_date,OLD.cust_id);
END;
使用BEFORE DELETE触发器的优点(相对于AFTER DELETE触发器来说),如果由于某种原因,订单不能存档,DELETE本身将被放弃。正如所见,触发器deleteorder触发器使用了BEGIN和END语句标记触发器体。这在此例子中并不是必须的,不过使用BEGIN END块的好处是触发器能容纳多条SQL语句。
UPDATE触发器
1.在UPDATE触发器代码中,你可以引用一个名为OLD的虚拟表,引用一个NEW的虚拟表访问新更新的值。
2.BEFORE UPDATE触发器中,NEW中的值可能也被更新。
3.OLD中的值全都是只读的,不能更新。
保证州名都是大写:
CREATE TRIGGER upatevendor BEFORE UPDATE ON vendors FOR EACH ROW SET NEW.vend_state=Upper(NEW.vend_state);
遗憾的是MySQL中触发器中不支持CALL语句。这表示不能从触发器内调用存储过程。