一、触发器的概念

​触发器是当某个表发生更改(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语句中给出的是大写还是小写

技术
下载桌面版
GitHub
百度网盘(提取码:draw)
Gitee
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:766591547
关注微信