mysql笔记25:使用触发器

触发器: 当我们希望在事件之前或者之后自动执行操作时,我们可以设定触发器,触发器可在设定以下事件之前或者之后:

  1. delete
  2. insert
  3. 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触发器有以下特点:

  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 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触发器具备以下特点:

  1. 在触发器(无论是before还是after)代码中,可以用old访问update之前的值,而用new表访问之后的值
  2. 即便是before update触发器,还没有update时,也可以修改new表
  3. old表的值都是只读的无法更新

如以下触发器对update语句的vend_state进行修饰,将其全置为大写:
create trigger updatevendor before update on vendors
for each row set new.vend_state = update(new.vend_state);

上一篇:有关链表的算法题中使用 辅助结点(剑指 Offer 25. 合并两个排序的链表)


下一篇:25.继承的作用是?Java 如何实现继承?继承小总结