2 不能,因为数据库自身的事物控制,虽然我不清楚到底是先执行的insert 表1,还是触发器,但是如果触发器执行不成功,你的insert肯定也执行不成功的,他们在同一个事务里。
最后:如果你的更新实时性要求不高的话,可以弄个存储过程,一段时间再更新一次,这样效率会高一点,
或者那个for each row 你研究一下是不是有其他可选的方案
after和before的区别:after是先完成数据的增删改,再触发,触发的语句晚于监视的增删改 *** 作,无法影响前面的增删改动作;也就是说先插入订单记录,再更新商品的数量;
before是先完成触发,再增删改,触发的语句先于监视的增删改,我们就有机会判断,修改即将发生的 *** 作;
我们用一个典型案例来区分它们的区别,新建一个触发器:
#监视地点: 商品表o
#监视事件:insert
#触发时间:before
#触发事件:update
案例:当新增一条订单记录时,判断订单的商品数量,如果数量大于10,就默认改为10
create trigger tg6
before insert on o
for each row
begin
if new.much >10 then
set new.much = 10
end if
update g set num = num - new.much where id = new.gid
end$
执行完,把之前创建的after触发器删掉,再来插入一条订单记录:
insert into o(gid,much) valus(1,20)$
执行完会发现订单记录的数量变为10,商品1的数量变为0了,就不会出现负数了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)