MySQL/Trigger

維基教科書,自由的教學讀本

觸發器是與表有關的資料庫對象,在滿足定義條件時觸發,並執行觸發器中定義的語句集合。觸發器的這種特性可以協助應用在資料庫端確保數據的完整性。

創建觸發器的語法如下:

DELIMITER ||
CREATE TRIGGER `<databaseName>`.`<triggerName>`
< [ BEFORE | AFTER ] > < [ INSERT | UPDATE | DELETE ] >
ON [dbo]<tableName> //dbo(所有者)
FOR EACH ROW
BEGIN
...

END ||
DELIMITER ;
  • trigger_name:觸發器的名稱
  • tirgger_time:觸發時機,為BEFORE或者AFTER
  • trigger_event:觸發事件,為INSERT、DELETE或者UPDATE
  • mysql默認是以 ; 作為結束執行語句,與觸發器中需要的分行起衝突。可用DELIMITER重新定義語句的結束符號。

在BEGIN...END語句中也可以定義變量,但是只能在BEGIN...END內部使用:

DECLARE var_name var_type [DEFAULT value] #定义变量,可指定默认值
SET var_name = value  #给变量赋值

NEW與OLD關鍵字:

  • NEW.columnname:新增行的某列數據
  • OLD.columnname:刪除行的某列數據

例如,在user表中增加一個用戶後,在log表中寫一行日誌:

DELIMITER $
CREATE TRIGGER user_log AFTER INSERT ON users FOR EACH ROW
BEGIN
DECLARE s1 VARCHAR(40)character set utf8;
DECLARE s2 VARCHAR(20) character set utf8;#后面发现中文字符编码出现乱码,这里设置字符集
SET s2 = " is created";
SET s1 = CONCAT(NEW.name,s2);     #函数CONCAT可以将字符串连接
INSERT INTO logs(log) values(s1);
END $
DELIMITER ;

限制和注意事項[編輯]

  • 觸發程序不能調用將數據返回客戶端的存儲程序,也不能使用採用CALL語句的動態SQL語句,但是允許存儲程序通過參數將數據返回觸發程序,也就是存儲過程或者函數通過OUT或者INOUT類型的參數將數據返回觸發器是可以的,但是不能調用直接返回數據的過程。
  • 不能在觸發器中使用以顯示或隱式方式開始或結束事務的語句,如START TRANS-ACTION,COMMIT或ROLLBACK。
  • MySQL的觸發器是按照BEFORE觸發器、行操作、AFTER觸發器的順序執行的,其中任何一步發生錯誤都不會繼續執行剩下的操作,如果對事務表進行的操作,如果出現錯誤,那麼將會被回滾,如果是對非事務表進行操作,那麼就無法回滾了,數據可能會出錯。