我們先做個測試:
接上篇日誌建的商品表g和訂單表o和觸發器
假設:假設商品表有商品1,數量是10;
我們往訂單表插入一條記錄:
insert into o(gid,much) values(1,20);
會發現商品1的數量變爲-10了。這就是問題的所在,因爲我們之前創建的觸發器是after,也就是說觸發的語句是在插入訂單記錄之後才執行的,這樣我們就無法判斷新插入訂單的購買數量。
先講一下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了,就不會出現負數