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语句中给出的是大写还是小写