MYSQL是在5.0以後的版本中引入觸發器的。
有的時候,可以用觸發器來維護數據的完整性。如我有一個表ge_element,該表中有一個region_id,對應到ge_region表中的id,但是,region_id是可以爲空的,所以不應該設置外鍵約束,而我在刪除ge_region表中的記錄時,希望把在ge_element表中被引用到的記錄的region_id設爲0,因爲沒有數據庫的外鍵約束,我只能在程序中操作,但我又不想通過程序來操作,因爲引用region_id的表可能不只ge_element一個,這時,就可能用到觸發器,在刪除ge_region表中的記錄時,把被引用的表中的region_id設爲0。
1.創建觸發器的語句:
CREATE TRIGGER <觸發器名稱> <--
{ BEFORE | AFTER }
{ INSERT | UPDATE | DELETE }
ON <表名稱>
FOR EACH ROW
<觸發器SQL語句>
觸發器必須有名字,最多64個字符,可能後面會附有分隔符.它和MySQL中其他對象的命名方式基本相象.
這裏我有個習慣:就是用表的名字+'_'+觸發器類型的縮寫.因此如果是表t26,觸發器是在事件UPDATE(參考下面的點(2)和(3))之前(BEFORE)的,那麼它的名字就是t26_bu。
可以直接在EMS中創建觸發器。
2.觸發時間:
Before表示在事件發生之前執行觸發器,After表示在事件發生之後執行觸發器;
3.觸發事件:
三個事件:insert, update, delete
4.觸發器與表的關係:
觸發器是屬於一個表的,當在這個表上執行insert, update, delete操作時,就會導致相應的觸發器被激活;
不能給同一個表的同一個操作創建兩個不同的觸發器。
5.觸發間隔:
FOR EACH ROW 子句通知觸發器每隔一行執行一次動作,而不是對整下表執行一次。
6.觸發的SQL語句:
觸發器包含所要觸發的SQL語句:這裏的語句可以是任何合法的語句,包括複合語句,但是這裏的語句受的限制和函數的一樣。
複合語句(BEGIN / END)是合法的.
流控制(Flow-of-control)語句(IF, CASE, WHILE, LOOP, WHILE, REPEAT, LEAVE,ITERATE)也是合法的.
變量聲明(DECLARE)以及指派(SET)是合法的.
允許條件聲明.
異常處理聲明也是允許的.
但是在這裏要記住函數有受限條件:不能在函數中訪問表.因此在函數中使用以下語句是非法的。
7.創建觸發器的權限:
你必須要有相當大的權限才能夠創建觸發器;我在創建觸發器的時候提示要有super privilege纔可以創建;