触发器: 当我们希望在事件之前或者之后自动执行操作时,我们可以设定触发器,触发器可在设定以下事件之前或者之后:
-- 下面创建的触发器在每次对products表的某一行插入之后都会打印"insert a row"
create trigger newproduct after insert on products
for each row select "insert a row";
drop trigger newproduct;
insert触发器有以下特点:
示例:
create trigger neworder after insert on orders
for each row select new.order_num into @lastid;
before触发器一般用于数据验证和数据净化
在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语句的vend_state进行修饰,将其全置为大写:
create trigger updatevendor before update on vendors
for each row set new.vend_state = update(new.vend_state);