接着Mysql触发器上篇来讲--------
根据上篇的插入触发器,sql语句如下:
create trigger t1
after
insert
on ord
for each row
begin
update goods set num=num-new.much where gid=new.gid ;
end$
当用户提交的订单数量new.much大于库存num的时候,会直接造成num是负数,显然在实际中是不允许的。
因此,这个插入触发器这样子写,显然是不可取的。
解决办法:在触发器中,写一个判断语句,如果订单数量大于库存时,修改订单数量为库存的数量。(sql语句如下:)
create trigger t5
after
insert
on ord
for each row
begin
declare rum 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$
但是上面的触发器t5会报错:ERROR 1362 (HY000): Updating of NEW row is not allowed in after trigger
意思就是说:在表已经更新后,触发器再触发是不允许。
大白话的意思就是:表(goods)修改后,才触发t5。显然表修改后,(此时订单数量大于库存)库存num已经是负数,此时再触发t5,显然于事无补了,因为表修改,已经写入磁盘了。生米已成熟饭。
那怎么改呢?
解决办法:把after改为before即可
(这里的触发器叫t6)
create trigger t6
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$
接下来剖析一下触发器的语句:
首先补充一些知识点:
触发器的四要素:
1.监视地点(table)
2.监视事件(insert\update\delete)
3.触发时间(after\before)
4.触发事件(insert\update\delete)
以触发器t6为例
create trigger t6
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$
Ps:这是小编的小总结,各位技术大佬勿喷,但是欢迎纠错指正,小编愿闻其详。同时也希望把一些知识传播、分享给更多的人。