萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> mysql教程 >> 學習筆記之MySQL觸發器詳解

學習筆記之MySQL觸發器詳解

觸發器是由事件來觸發某個操作,這些事件包括INSERT語句,UPDATE語句和DELETE語句

創建觸發器

創建只有一個執行語句的觸發器
CREATE TRIGGER 觸發器名 BEFORE|AFTER 觸發事件
ON 表名 FOR EACH ROW 執行語句其中,觸發器名參數指要創建的觸發器的名字

1、創建MySQL觸發器:

語法:

 代碼如下 復制代碼

CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name 

FOR EACH ROW 

BEGIN 

trigger_stmt 

END; 

CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name

FOR EACH ROW 

BEGIN

trigger_stmt

END;

 


例子

 代碼如下 復制代碼

CREATE TRIGGER SetUserHome after insert ON users 

FOR EACH ROW 

BEGIN 

update `users` set homeLocationX = 128,

homeLocationY=128, homeLocationZ=30 

where uuid = NEW.uuid

END 

以上的例子是錯誤的, 讓本表進行觸發時進行更新會讓程序進入死循環。


系統會報這樣的錯誤:it is already used by statement which invoked this stored function/trigger.

應該改成以下語句:

 代碼如下 復制代碼

CREATE TRIGGER SetUserHome before insert ON users 

FOR EACH ROW 

BEGIN 

set New.homeLocationX = 128;

set New.homeLocationY = 128;

set New.homeLocationZ=30; 

END 

BEFORE和AFTER參數指定了觸發執行的時間,在事件之前或是之後

FOR EACH ROW表示任何一條記錄上的操作滿足觸發事件都會觸發該觸發器

 代碼如下 復制代碼

mysql> CREATE TRIGGER trig1 AFTER INSERT
    -> ON work FOR EACH ROW
    -> INSERT INTO time VALUES(NOW());


Query OK, 0 rows affected (0.09 sec)上面創建了一個名為trig1的觸發器,一旦在work中有插入動作,就會自動往time表裡插入當前時間

 

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

CREATE TRIGGER 觸發器名 BEFORE|AFTER 觸發事件
ON 表名 FOR EACH ROW
BEGIN
    執行語句列表
END其中,BEGIN與END之間的執行語句列表參數表示需要執行的多個語句,不同語句用分號隔開

tips:一般情況下,mysql默認是以 ; 作為結束執行語句,與觸發器中需要的分行起沖突

     為解決此問題可用DELIMITER,如:DELIMITER ||,可以將結束符號變成||

     當觸發器創建完成後,可以用DELIMITER ;來將結束符號變成;

 

 代碼如下 復制代碼

mysql> DELIMITER ||
mysql> CREATE TRIGGER trig2 BEFORE DELETE
    -> ON work FOR EACH ROW
    -> BEGIN
    -> INSERT INTO time VALUES(NOW());
    -> INSERT INTO time VALUES(NOW());
    -> END
    -> ||
Query OK, 0 rows affected (0.06 sec)


 

mysql> DELIMITER ;上面的語句中,開頭將結束符號定義為||,中間定義一個觸發器,一旦有滿足條件的刪除操作

就會執行BEGIN和END中的語句,接著使用||結束

最後使用DELIMITER ; 將結束符號還原

 查看觸發器

SHOW TRIGGERS語句查看觸發器信息

 代碼如下 復制代碼 mysql> SHOW TRIGGERSG;
*************************** 1. row ***************************
             Trigger: trig1
               Event: INSERT
               Table: work
           Statement: INSERT INTO time VALUES(NOW())
              Timing: AFTER
             Created: NULL
            sql_mode:
             Definer: root@localhost
character_set_client: utf8
collation_connection: utf8_general_ci

  Database Collation: latin1_swedish_ci結果會顯示所有觸發器的基本信息

tips:SHOW TRIGGERS語句無法查詢指定的觸發器

 在triggers表中查看觸發器信息

 代碼如下 復制代碼 mysql> SELECT * FROM information_schema.triggersG
*************************** 1. row ***************************
           TRIGGER_CATALOG: def
            TRIGGER_SCHEMA: person
              TRIGGER_NAME: trig1
        EVENT_MANIPULATION: INSERT
      EVENT_OBJECT_CATALOG: def
       EVENT_OBJECT_SCHEMA: person
        EVENT_OBJECT_TABLE: work
              ACTION_ORDER: 0
          ACTION_CONDITION: NULL
          ACTION_STATEMENT: INSERT INTO time VALUES(NOW())

結果顯示了所有觸發器的詳細信息,同時,該方法可以查詢制定觸發器的詳細信息

 

 代碼如下 復制代碼 mysql> SELECT * FROM information_schema.triggers WHERE TRIGGER_NAME='trig1'G
*************************** 1. row ***************************
           TRIGGER_CATALOG: def
            TRIGGER_SCHEMA: person
              TRIGGER_NAME: trig1
        EVENT_MANIPULATION: INSERT
      EVENT_OBJECT_CATALOG: def
       EVENT_OBJECT_SCHEMA: person
        EVENT_OBJECT_TABLE: worktips

:所有觸發器信息都存儲在information_schema數據庫下的triggers表中

     可以使用SELECT語句查詢,如果觸發器信息過多,最好通過TRIGGER_NAME字段指定查詢

 刪除觸發器

mysql> DROP TRIGGER trig1;
Query OK, 0 rows affected (0.04 sec)刪除觸發器之後最好使用上面的方法查看一遍

同時,也可以使用database.trig來指定某個數據庫中的觸發器

tips:如果不需要某個觸發器時一定要將這個觸發器刪除,以免造成意外操

copyright © 萬盛學電腦網 all rights reserved