### mysql之觸發器before和after的區別
我們先做個測試:接上篇日志建的商品表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了,就不會出現負數了。
- 授權管理
- 角色管理
- 設置密碼
- 5.6 版本
- 系統用戶
- 當前用戶
- 目錄
- 設計規劃
- 數據字典
- 狀態監控
- 查看MYSQL表占用空間狀態
- show table status
- SHOW 命令
- SHOW TABLE STATUS
- 表格輸出
- 調優
- 書籍培訓
- 數據庫管理員的第一本書(原書第2版)
- 視頻
- 收獲,不止SQL優化
- 基本概念
- 工具
- phpMyadmin
- 變更管理
- 數據關系與原則
- 數據完整性
- 業務完整性
- 字段更新(1)
- 訂單應用(1)
- 訂單應用(2)
- 表間數據連接
- 數據管理
- Cheet Sheet
- Database Administrator
- 索引設計
- Mysql 四種常見的索引
- MySQL索引之主鍵索引
- MySQL索引使用對查詢、插入速度的影響
- 查詢優化
- 存儲優化
- 分割數據表字段
- Procedure_Analyse優化表結構
- 性能優化
- 拆分DELETE/INSERT語句
- MySQL命令
- 表復制
- 如何快速創建相同結構的表
- 主鍵設計
- 為什么推薦InnoDB引擎使用自增主鍵?
- INFORMATION_SCHEMA
- _5.6版本
- USER_PRIVILEGES