如何在触发器引用行的值?
1.对于insert 而言,新增的行用 new 来表示
行中每一列的值,用 new.列名 来表示
2.对于delete来说,原本有一行,后来被删除
想引用被删除的这一行用 old 来表示,
old.列名 就可以引用被删行中的值
3.对于update来说,被修改的行
修改前的数据,用old来表示,old.列名 引用被修改之前行中的值
修改后的数据,用new来表示,new.列名 引用被修改之后行中的值
综上:
监视的事件是insert,触发的事件中引用行的值 new.列名
监视的事件是delete,触发的事件中引用行的值 old.列名
监视的事件是update,触发的事件中引用行的值 old.列名 new.列名
----------------------------------------
一张商品表g,一张订单表o
create table g (g_id int,g_name char(2),g_inventory int);
insert into g values
(1,"猪",23),
(2,"鸭",18),
(3,"羊",15),
(4,"牛",30);
create table o (o_id int,o_name char(2),o_buy int);
例1:订单表有新增,商品表库存数据就会减少:
delimiter $
create trigger t1
after insert on o
for each row
begin
update g set g_inventory=g_inventory-new.o_buy where g_name=new.o_name;
end$
insert into o values (1,"猪",3)$
select * from o$
+------+--------+-------+
| o_id | o_name | o_buy |
+------+--------+-------+
| 1 | 猪 | 3 |
+------+--------+-------+
select * from g$
+------+--------+-------------+
| g_id | g_name | g_inventory |
+------+--------+-------------+
| 1 | 猪 | 20 |
| 2 | 鸭 | 18 |
| 3 | 羊 | 15 |
| 4 | 牛 | 30 |
+------+--------+-------------+
---------------------------------------------------
例2:创建删除订单的触发器:
#监视地点:o表
#监视事件:delete
#触发时间:after
#触发事件:update
create trigger t2
after delete on o
for each row
begin
update g set g_inventory=g_inventory+old.o_buy where g_name=old.o_name;
end$
----------------------------------------
例3:创建修改订单的触发器:
#监视地点:o表
#监视事件:update
#触发时间:after
#触发事件:update
create trigger t3
after update on o
for each row
begin
update g set g_inventory=g_inventory+old.o_buy-new.o_buy where g_name=old.o_name;
end$