mysql之觸發器before和after的區別

2021-07-08 17:38:42 字數 916 閱讀 4067

我們先做個測試:

接上篇日誌建的商品表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了,就不會出現負數了。

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...