1. 程式人生 > >Mysql學習總結(10)——MySql觸發器使用講解

Mysql學習總結(10)——MySql觸發器使用講解

  觸發器(TRIGGER)是由事件來觸發某個操作。這些事件包括INSERT語句、UPDATE語句和DELETE語句。當資料庫系統執行這些事件時,就會啟用觸發器執行相應的操作。MySQL從5.0.2版本開始支援觸發器。在本文中將講解的內容包括:
觸發器的含義和作用
如何建立觸發器
如何檢視觸發器
如何刪除觸發器

       觸發器是由INSERT、UPDATE和DELETE等事件來觸發某種特定操作。滿足觸發器的觸發條件時,資料庫系統就會執行觸發器中定義的程式語句。這樣做可以保證某些操作之間的一致性。例如,當學生表中增加了一個學生的資訊時,學生的總數就必須同時改變。可以在這裡建立一個觸發器,每次增加一個學生的記錄,就執行一次計算學生總數的操作。這樣就可以保證每次增加學生的記錄後,學生總數是與記錄數是一致的。觸發器觸發的執行語句可能只有一個,也可能有多個。本節將詳細講解建立觸發器的方法。

一、語法

建立只有一個執行語句的觸發器

MySQL中,建立只有一個執行語句的觸發器的基本形式如下:

  1. CREATETRIGGER 觸發器名 BEFORE | AFTER 觸發事件  
  2. ON 表名 FOR EACH ROW 執行語句  

建立有多個執行語句的觸發器

MySQL中,觸發器觸發的執行語句可能有多個。建立有多個執行語句的觸發器的基本形式如下:

  1. CREATETRIGGER 觸發器名 BEFORE | AFTER 觸發事件  
  2. ON 表名 FOR EACH ROW  
  3. BEGIN
  4. 執行語句列表  
  5. END
下面來具體說說語法

1、命名規則

  1. CREATETRIGGER
     <觸發器名稱> <--
  2. { BEFORE | AFTER }  
  3. INSERT | UPDATE | DELETE }  
  4. ON <表名稱>  
  5. FOR EACH ROW  
  6. BEGIN
  7. <觸發器SQL語句>  
  8. END
觸發器必須有名字,最多64個字元,可能後面會附有分隔符.它和MySQL中其他物件的命名方式基本相象.
2、觸發時間: BEFORE | AFTER 
觸發器有執行的時間設定:INSERT | UPDATE | DELETE 
3、觸發事件前後
同樣也能設定觸發的事件:它們可以在執行insert、update或delete的過程中觸發。

4.、表
觸發器是屬於某一個表的:當在這個表上執行插入、
更新或刪除操作的時候就導致觸發器的啟用.
我們不能給同一張表的同一個事件安排兩個觸發器。
5.、( 步長)觸發間隔
觸發器的執行間隔:FOR EACH ROW子句通知觸發器
每隔一行執行一次動作,而不是對整個表執行一次。
6、 語句
觸發器包含所要觸發的SQL語句:這裡的語句可以是任何合法的語句,
包括複合語句,但是這裡的語句受的限制和函式的一樣。
Privileges許可權
你必須擁有相當大的許可權才能建立觸發器(CREATE TRIGGER)。如果你已經是Root使用者,那麼就足夠了。這跟SQL的標準有所不同。


二、關於舊的和新建立的列的標識

     在觸發器的SQL語句中,你可以關聯表中的任意列。但你不能僅使用列的名稱去標識,那會使系統混淆,因為那裡可能會有列的新名(這可能正是你要修改的,你的動作可能正是要修改列名),還有列的舊名存在。因此你必須用這樣的語法來標識: "NEW . column_name"或者"OLD . column_name".這樣在技術上處理(NEW | OLD . column_name)新和舊的列名屬於建立了過渡變數("transition variables")。 

      對於INSERT語句,只有NEW是合法的;對於DELETE語句,只有OLD才合法;而UPDATE語句可以在和NEW以及OLD同時使用。

三、使用範例

先建立兩個表、一個訂單表,一個訂單時間表

  1. CREATETABLE T_ORDER(  
  2. ORDER_NUM INTPRIMARYKEY,  
  3. ORDER_NAME CHAR(10) NOTNULL
  4. );  
  5. CREATETABLE T_ORDER_TIME(  
  6. ORDER_NUM INTPRIMARYKEY,  
  7. ORDER_TIME TIMESTAMPNOTNULL,  
  8. )  

1、建立插入時的觸發器

  1. CREATETRIGGER TRI_INSERT  
  2. AFTERINSERTON T_ORDER FOR EACH ROW  
  3. BEGIN
  4. INSERTINTO learning.t_order_time(ORDER_NUM,ORDER_TIME) VALUES(NEW.ORDER_NUM,NOW());  
  5. END
然後訂單表中插入一條資料
  1. INSERTINTO T_ORDER(ORDER_NUM,ORDER_NAME) VALUES(1,'電腦');  
  2. SELECT * FROM t_order;  
  3. SELECT * FROM t_order_time;  
這是訂單表中插入的資料:


這是訂單時間表中自動插入的資料:


2、更新時插入資料

  1. //更新建立觸發器  
  2. CREATETRIGGER TRI_UPDATA  
  3. BEFORE UPDATEON T_ORDER FOR EACH ROW  
  4. BEGIN
  5. UPDATE  learning.t_order_time SET ORDER_TIME=NOW() WHERE OLD.ORDER_NUM=ORDER_NUM;  
  6. END
  7. UPDATE T_ORDER  SET ORDER_NAME='餅乾餅'WHERE ORDER_NUM=1;  
  8. SELECT * FROM t_order;  
  9. SELECT * FROM t_order_time;  


可以看到,時間已經更新

3、建立刪除觸發器

  1. //建立刪除觸發器
  2. CREATE TRIGGER TRI_DELETE  
  3. AFTER DELETE ON T_ORDER FOR EACH ROW  
  4. BEGIN  
  5. DELETE FROM  learning.t_order_time  WHERE OLD.ORDER_NUM=ORDER_NUM;  
  6. END  
  7. DELETE FROM  learning.t_order  WHERE ORDER_NUM=1;  
  8. SELECT * FROM t_order;  
  9. SELECT * FROM t_order_time;  


可以看到,資料庫中都沒有資料了。


4、檢視觸發器

檢視觸發器是指檢視資料庫中已存在的觸發器的定義、狀態和語法等資訊。檢視觸發器的方法包括SHOW TRIGGERS語句和查詢information_schema資料庫下的triggers表等。本節將詳細講解檢視觸發器的方法。

MySQL中,可以執行SHOW TRIGGERS語句來檢視觸發器的基本資訊。其基本形式如下:

SHOW TRIGGERS ;


MySQL中,所有觸發器的定義都存在information_schema資料庫下的triggers表中。查詢triggers表,可以檢視到資料庫中所有觸發器的詳細資訊。查詢的語句如下:

SELECT *  FROM  information_schema.triggers;


5、刪除觸發器
  1. DROPTRIGGER 觸發器名  

6、觸發器 與儲存過程
觸發程式不能呼叫將資料返回客戶端的儲存程式,也不能使用採用CALL語句的動態SQL
(允許儲存程式通過引數將資料返回觸發程式)。 
而儲存過程 可以接受引數,將結果範圍給應用程式