触发器

Posted aten

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了触发器相关的知识,希望对你有一定的参考价值。

触发器 trigger
	创建create trigger t1
	删除drop trigger t1
	查看show triggers G
需求
商品表goods
订单表prd

当下一个订单 对应商品相对减少(买几个少几个

分析
监视谁 prd
监视动作 insert
触发时间 after
触发事件 update

create trigger t1
after
insert
on prd
for each row
begin
update goods xxxxx
end;

创建表
create table goods(
	gid int,
	name varchar(20),
	num smallint
);

create table prd(
	pid int,
	gid int,
	much smallint
);

创建数据
insert into goods values
(1,‘cat‘,34),
(2,‘dog‘,65),
(3,‘pig‘,21);

insert into prd values(1,1,2);

创建触发器(	加$符号使数据库识别该语句为不分行)
delimiter $
create trigger t1
after
insert
on prd
for each row
begin
update goods set num=num-2 where gid=1;
end$
问题:为什么买什么都减少两只猫呢
答案:因为触发器减少的gid=1,这里要动态引入变量

(增加)触发器引入变量new
delimiter $
create trigger t2
after
insert
on prd
for each row
begin
update goods set num=num-new.much where gid=new.gid;
end$

(删除)触发器引入变量old
delimiter $
create trigger t3
after
delete
on prd
for each row
begin
update goods set num=num+old.much where gid=old.gid;
end$

(更改)触发器引入变量old
delimiter $
create trigger t4
before
update
on prd
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 prd
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已经来不及了

在t5基础上,继续改进
create trigger t6
before
insert
on prd
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$

在触发器中 for each row是干嘛的
在Oracle触发器中,触发器分语句级触发器,和行级触发器(每一行受影响,触发器都执行)
比如
create trigger th
after update
on xxtable
for each row
begin 
	sqlN
end$
当执行:update xxtable set xxx=xxx where id>100;
那么sqlN会被触发100次

在Oracle中for each row如果不写
无论update语句执行多少行,都执行一次

  

以上是关于触发器的主要内容,如果未能解决你的问题,请参考以下文章

导航到另一个片段时触发 API 调用

我如何使用 codeanywhere 片段

前端防扒代码片段

前端防扒代码片段

前端防扒代码片段

前端防扒代码片段