觸發器(trigger)顧名思義能夠監視某種情況,當情況發生時,觸發某種操作
應用場景:
1、網購過程中。當提交商品訂單時,往訂單表中插入新記錄,觸發相應商品表的庫存做出相應降低。
2、支付過程中,確認支付時觸發驗證卡上剩餘金額。
等等以網購的情況舉例說明觸發器的作用:
現有商品表(goods)。包含商品id(goods_id)。商品名(goods_name)。庫存數量(goods_name)
還有訂單表(order_table),包含商品id(goods_id)。購買數量(buy_num)
假設往訂單表中插入一行記錄
代表使用者購買了20個商品id為1的商品,即購買了20臺小公尺手機
與此同一時候,在邏輯上goods表中小公尺手機的庫存也應該減去20臺。
這兩步事實上應該是乙個總體。而我們如今是手工操作。怎樣讓第一步完畢後,第二步自己主動執行呢?
這就能夠用到觸發器的概念。第一條插入語句的執行。觸發了第二條改動庫存的sql
觸發器四要素:
監視地點、監視事件、觸發時間、觸發事件
監視地點:觸發器監視的物件是表
監視事件:觸發器監視的事件僅僅能是增、刪、改
觸發事件:也僅僅能是增、刪、改
檢視當前已有的觸發器:
show triggers;
觸發器的建立:
create trigger 觸發器名稱
after/befor (觸發時間)
insert/update/delete (監視事件)
on 表名 (監視位址)
for each row
begin
sql1;
sqln;
end須要注意點 是,所須要觸發的sql語句都要以『;』結束。
end後面也須要有分界符。但不能再是';'。
所以建立觸發器之前須要先改動分界符
delimiter 分界符
如今利用觸發器對上面的樣例進行改動
這個觸發器以完畢:當訂購了20個商品id為1的商品時。goods表的庫存會同步減去20。我們來看看效果
商品id為1的商品庫存的確減去了20。觸發器的確完畢了任務,但這個觸發器並不智慧型。他僅僅能處理商品id為1,購買數量為20的情況。要想應對其它情況須要獲得提交訂單的記錄才行。
觸發器引用行變數:
對於insert。插入一行後出現了乙個新行用new表示,在觸發器中能夠通過new.列名來引用插入行各個欄位的值
對於delete。刪除一行後之前的那行不見了。用old表示。在觸發器中能夠通過old.列名來引用被刪除行各個欄位的值
對於update。改動一行後舊的一樣用old表示,新的一行用new表示,在觸發器中能夠通過new.列名來引用改動後行各個欄位的值,old.列名來引用改動前各個欄位的值。
知道這些後,對觸發器進行進一步改動
再看一下效果
沒有提交訂單前商品表的情況
提交兩個訂單
商品表變化
可見觸發器的確發生了作用
觸發器after和before的差別:
after是先完畢增刪改再觸發
before是在增刪改之前將以推斷
前面已經討論過after的情況。如今假設提交了乙個訂單購買了100個id為4的商品,然而三星手機庫存僅有30個。假設依照上面的觸發器。最後庫存會變成-70。這顯然是不正確的。所以這時候能夠利用before來對輸入進行推斷。假設購買數量大於庫存則僅僅能購買所剩下的商品。
如今購買100個id為4的商品
再看看訂單表
實際購買的僅僅有30而不是100
mysql 修改表 MySQL修改表
mysql修改表 說明 1.建立錶能做的事,修改表幾乎都能做,不推薦使用。2.修改表修改表的結構 3,大體來說,可以對欄位進行新增,刪除,修改 可以對索引進行新增,刪除 4.表的選項,通常都是修改,即使不寫任何乙個 新增乙個表的字段 alter table 表名 add column 新欄位名 字段...
mysql 修改表命令 MySQL常用修改表命令
mysql常用修改表命令 1.新增字段 alter table 表名 add 欄位名 first after 列名 alter table teacher add address varchar 50 comment 位址 最後一列 alter table teacher add address v...
mysql 怎麼修改表型別 修改MYSQL表型別
最近遇到乙個修改 mysql 表型別的問題,以前在 phpmyadmin 管理 mysql 資料庫時,建立的表預設是 myisam 型別,而且修改表型別也比較方便。奈何現在配置 phpmyadmin 出了問題,也懶得去弄了,就裝了另乙個 mysql 的管理工具,比較方便。可是我新建的表預設確是 in...