触发器: 当我们希望在事件之前或者之后自动执行操作时,我们可以设定触发器,触发器可在设定以下事件之前或者之后:
- delete
- insert
- update
25.1 创建触发器
-- 下面创建的触发器在每次对products表的某一行插入之后都会打印"insert a row"
create trigger newproduct after insert on products
for each row select "insert a row";
25.2 删除触发器
drop trigger newproduct;
几种不同的触发器的特点
insert触发器
insert触发器有以下特点:
- 在insert触发器代码中,可以引用名为NEW的虚拟表去访问插入行
- 在before insert触发器中,new的值也可以被更新
- 对auto_increment列,new表该列在insert之前包含0,在insert之后包含新的自动生成的值
示例:
create trigger neworder after insert on orders
for each row select new.order_num into @lastid;
before触发器一般用于数据验证和数据净化
delete触发器
在delete之前和之后,可以通过old表来访问被删除的行,old表的数据是只读的。
例如下面的触发器用于在删除之前,将数据插入到备份表中
create trigger deleteorder before delete on orders
for each row
begin
insert into archieve_orders(order_num, order_date, cust_id) values (old.order_num, old.order_date, old.cust_id);
end;
尽量使用delete before而不是delete after触发器,前者在触发器语句失败时,不会执行删除语句。保证了数据的安全
update触发器
update触发器在update语句执行之前和执行之后执行。
update触发器具备以下特点:
- 在触发器(无论是before还是after)代码中,可以用old访问update之前的值,而用new表访问之后的值
- 即便是before update触发器,还没有update时,也可以修改new表
- old表的值都是只读的无法更新
如以下触发器对update语句的vend_state进行修饰,将其全置为大写:
create trigger updatevendor before update on vendors
for each row set new.vend_state = update(new.vend_state);