触发器
触发器是一类特殊的事务,可以监视某种数据操作并触发相关操作
需求:
商品表:goods
订单表:rod
当下一个订单时,对应的商品要减少(买几个商品就少几个库存)
分析:
监视谁:ord
监视动作:insert
触发器:after
触发事件:update
create trigger t1
after
insert
on
ord
for each row
begin
update goods xxxx
end;
create table goods(
gid int,
name varchar(20),
num smallint
)
create table ord(
ord int,
gid int,
much smallint
)
insert into goods values
(1,'cat',34),
(2,'dog',65),
(3,'pig',21);
update goods set num=num-2 where gid=1;
触发器引用变量
insert 新行 new
delete 旧行 old
delimiter $
create trigger t1
after
insert
on ord
for each row
begin
update goods set num=num-2 where gid=1;
end$
show triggers;
买什么商品都只减少猫
create trigger t2
after
insert
on ord
for each row
begin
update goods set num=num-new.much where gid=new.gid;
end$
查看已有triggers:show triggers
删除已有trigger:drop trigger t1;
删除订单时的触发器
create trigger t3
after
delete
on ord
for each row
begin
update goods set num=num+old.much where gid=old.gid;
end$
清空表:truncate org;
insert into ord values(123,2,4)
修改订单时的触发器(仅限修改数量)
create trigger t4
before
update
on ord
for each row
begin
update goods set num=num+old.much-new.much where gid=new.gid;
end$
思考:before与after之间的区别
思考:如果剩余3头猪,但是客户购买了10头猪,发生什么情况,能否预防
能否在购买量much>库存num时,把much自动改为num
before 关键字解决
在t2的基础上,完成much与num的判断
create trigger t5
after
insert
on ord
for each row
begin
declare
rnum int;
select num into rnum from goods where gid=new.gid;
if new.much>rnum then
set new.much=rnum;
end if;
update goods set num=num-new.much where gid=new.gid;
end$
updating of new row is not allowed in after trigger
原因:insert 之后,new行已经插入到表中,成为事实,改new已经晚了
create trigger t5
before
insert
on ord
for each row
begin
declare
rnum int;
select num into rnum from goods where gid=new.gid;
if new.much>rnum then
set new.much=rnum;
end if;
update goods set num=num-new.much where gid=new.gid;
end$
mysql触发器的一些demo
猜你喜欢
转载自blog.csdn.net/taotaobaobei/article/details/83305750
今日推荐
周排行