本文更新於2019-06-23,使用MySQL 5.7,操作系統為Deepin 15.4。 SQL語句 為了便於描述,此處將創建觸發器的DDL覆述一次,其已於“SQL”章節描述。 CREATE TRIGGER triggername BEFORE|AFTER INSERT|UPDATE|DELETE ...
本文更新於2019-06-23,使用MySQL 5.7,操作系統為Deepin 15.4。
目錄
SQL語句
為了便於描述,此處將創建觸發器的DDL覆述一次,其已於“SQL”章節描述。
CREATE TRIGGER triggername BEFORE|AFTER INSERT|UPDATE|DELETE
ON tablename FOR EACH ROW
statement_list
在statement_list中使用別名OLD
和NEW
來引用觸發器中發生變化的舊記錄和新記錄內容。目前觸發器只支持行級觸發,不支持語句級觸發。
觸發器是行觸發的,按照BEFORE
觸發器、行操作、AFTER
觸發器的順序執行,任何一步出錯都不會繼續執行餘下操作。如果是事務表,則會整個作為一個事務回滾。對INSERT INTO ... ON DUPLICATE KEY UPDATE ...
語句,若有重覆主鍵的記錄需進行UPDATE
,觸發順序為BEFORE INSERT
、BEFORE UPDATE
、AFTER UPDATE
;若沒有重覆主鍵的記錄直接INSERT
,觸發順序為BEFORE INSERT
、AFTER INSERT
。
statement_list可以通過存儲過程或函數的OUT
或INOUT
參數將數據返回觸發器,但不能調用直接RETURNS
的函數。也不能顯式或隱式開始或結束事務,如START TRANSACTION
、COMMIT
、ROLLBACK
。
示例
DELIMITER ;;
CREATE TRIGGER trigger_test BEFORE UPDATE
ON t FOR EACH ROW
BEGIN
INSERT INTO history(old_id, old_value, new_id, new_value) VALUES (OLD.id, OLD.value, NEW.id, NEW.value);
END;;
DELIMITER ;