觸發器(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 觸發器名稱需要注意點 是,所需要觸發的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