MySQL触发器

一、触发器的概念

​ 触发器是当某个表发生更改(delete、insert、update)时自动执行的一条MySQL语句(或位于begin和end语句之间的一组语句)。

二、创建触发器

​ 在创建触发器时,需要给出4条信息:

  • 唯一的触发器名;
  • 触发器关联的表;
  • 触发器应该响应的活动(delete、insert或update);
  • 触发器何时执行(处理之前before或之后after)。

举例:

create trigger newproduct after insert on products
for each row select 'Product added';
/*
	使用create trigger语句来创建名为newproduct的触发器,当对products表的任意一行成功执行插入操作之后,	 将在控制台显示Product added信息。
*/

before或after?

通常,将before用于数据验证和净化,目的是保证插入表中的数据确实是需要的数据。

三、删除触发器

drop trigger newproduct;

四、使用触发器

1. insert触发器

​ 在insert触发器代码内,你可以访问一个名为new的虚拟表,表中的内容为插入的行。

举例:

create trigger neworder after insert on orders
for each row select new.order_num;
-- 在每插入一行到orders表中时,将从虚拟表new中返回该行的order_num值显示在控制台上。

2. delete触发器

​ 在delete触发器代码内,你可以访问一个名为old的虚拟表,表中的内容为删除的行。但注意old表中的内容全部都是只读的,不能更新。

举例:

create trigger deleteorder before delete on orders
for each row
begin
	insert into archive_orders(order_num, order_date, cust_id)
	values(old.order_num, old.order_date, old.cust_id);
end;
/*
	利用old表来把将要被删除行中的数据保存到一个名为archive_orders的存档表中。当然前提是你需要先创建		archive_orders表。
*/

【注】使用before delete触发器的优点(相对于after触发器来说):

​ 如果由于某种原因,订单不能存档,即before触发器失败,那么delete删除行的操作也将不会被执行。

多语句触发器:正如所见,触发器deleteorder使用begin和end语句标记触发器体。这在本例中其实不是必需的,不过也没有害处。使用begin end块的好处是触发器能容纳多条SQL语句(在begin end块中一条挨着一条)。

3. update触发器

​ 在update触发器代码中,你既可以访问old虚拟表中更新之前行中的数据,也可以访问new虚拟表中更新之后行中的数据。

举例:

create trigger updatevendor before update on vendors
for each row set new.vend_state = upper(new.vend_state);
-- 用来保证vend_state总是大写,不管update语句中给出的是大写还是小写
posted @ 2020-05-15 10:22  Java程序员的进阶之路  阅读(323)  评论(0编辑  收藏  举报