INSERT触发器
- 可以引用NEW的虚拟表,访问被插入的行
- 在BEFORE INSERT触发器中,NEW中的值也可以被更新(允许更改被插入的值)
- 对于AUTO_INCREMENT列,NEW在INSERT执行之前包含0,在INSERT执行之后包含新的自动生成值。
CREATE TRIGGER neworder after INSERT on ordersfor EACH row SELECT new.order_num INTO @p;
没插入一个新订单
触发器获取订单编号,存储到@p中
INSERT INTO orders VALUES(20001,NOW(),10001)SELECT @p;

BEFORE还是AFTER
一般来说,before用于数据验证和净化(保证插入或者更新的数据确实是需要插入或者更新的数据)
DELETE触发器
- 可以引用OLD的虚拟表
- OLD的虚拟表是只读的,只能引用,不能更新
CREATE TRIGGER deleteorder BEFORE DELETE on ordersfor each rowBEGININSERT into archive_orders VALUES(OLD.order_num,OLD.order_date,OLD.cust_id);end;
BEFORE DELETE的优点
防止删错,将DELETE的行保存起来
UPDATE触发器
- 既可以引用NEW虚拟表,也可以引用OLD虚拟表
- 在BEFOREUPDATE触发器中,NEW中的值可能也被更新(允许更改将要用于UPDATE语句中的值);
- OLD中的值全都是只读的,不能更新。
CREATE TRIGGER updatevendor BEFORE UPDATE on vendorsfor each row set new.vend_state = UPPER(new.vend_state)
数据净化都是在BEFORE之前进行的
触发器的其他要点
使用触发器,把更改记录到其他表中非常容易
