mysql触发器的一些demo

触发器

触发器是一类特殊的事务,可以监视某种数据操作并触发相关操作

需求:
商品表: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$

猜你喜欢

转载自blog.csdn.net/taotaobaobei/article/details/83305750