程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> mysql---觸發器

mysql---觸發器

編輯:MySQL綜合教程

觸發器(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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved