我們先做個測試:
接上篇日誌建的商品表g和訂單表o和觸發器
假設:假設商品表有商品1,數量是10;
我們往訂單表插入一條記錄:
insert into o(gid,much) values(1,20);
會發現商品1的數量變為-10了。這就是問題的所在,因為我們之前建立的觸發器是after,也就是說觸發的語句是在插入訂單記錄之後才執行的,這樣我們就無法判斷新插入訂單的購買數量。
先講一下after和before的區別:
after是先完成資料的增刪改,再觸發,觸發的語句晚於監視的增刪改操作,無法影響前面的增刪改動作;也就是說先插入訂單記錄,再更新商品的數量;
before是先完成觸發,再增刪改,觸發的語句先於監視的增刪改,我們就有機會判斷,修改即將發生的操作;
我們用乙個典型案例來區分它們的區別,新建乙個觸發器:
#監視地點: 商品表o
#監視事件:insert
#觸發事件: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了,就不會出現負數了。
顯示觸發器:show triggers;
mysql之觸發器before和after的區別
我們先做個測試 接上篇日誌建的商品表g和訂單表o和觸發器 假設 假設商品表有商品1,數量是10 我們往訂單表插入一條記錄 insert into o gid,much values 1,20 會發現商品1的數量變為 10了。這就是問題的所在,因為我們之前建立的觸發器是after,也就是說觸發的語句是...
mysql之觸發器詳解 MySQL之觸發器詳解
觸發器 trigger 監事某種情況,並出發某種操作。觸發器建立語法四要素 1 監視地點 table 2 監視事件 insert update delete 3 觸發時間 after before 4 觸發事件 insert update delete create trigger triggern...
MySQL之觸發器
觸發器是個特殊的儲存過程 當乙個預定義的事件發生的時候,被mysql自動呼叫 1 建立只有乙個執行語句的觸發器 create trigger trigger name trigger time trigger event on tb1 name for each row trigger stmttr...