INSERT触发器

  • 可以引用NEW的虚拟表,访问被插入的行
  • 在BEFORE INSERT触发器中,NEW中的值也可以被更新(允许更改被插入的值)
  • 对于AUTO_INCREMENT列,NEW在INSERT执行之前包含0,在INSERT执行之后包含新的自动生成值。
  1. CREATE TRIGGER neworder after INSERT on orders
  2. for EACH row SELECT new.order_num INTO @p;

没插入一个新订单

触发器获取订单编号,存储到@p中

  1. INSERT INTO orders VALUES(20001,NOW(),10001)
  2. SELECT @p;

使用触发器 - 图1

BEFORE还是AFTER

一般来说,before用于数据验证和净化(保证插入或者更新的数据确实是需要插入或者更新的数据)

DELETE触发器

  • 可以引用OLD的虚拟表
  • OLD的虚拟表是只读的,只能引用,不能更新
  1. CREATE TRIGGER deleteorder BEFORE DELETE on orders
  2. for each row
  3. BEGIN
  4. INSERT into archive_orders VALUES(OLD.order_num,OLD.order_date,OLD.cust_id);
  5. end;

BEFORE DELETE的优点

防止删错,将DELETE的行保存起来

UPDATE触发器

  • 既可以引用NEW虚拟表,也可以引用OLD虚拟表
  • 在BEFOREUPDATE触发器中,NEW中的值可能也被更新(允许更改将要用于UPDATE语句中的值);
  • OLD中的值全都是只读的,不能更新。
  1. CREATE TRIGGER updatevendor BEFORE UPDATE on vendors
  2. for each row set new.vend_state = UPPER(new.vend_state)

数据净化都是在BEFORE之前进行的

触发器的其他要点

使用触发器,把更改记录到其他表中非常容易