觸發器是與表綁定的特殊存儲程序,由 DML 事件 (INSERT/UPDATE/DELETE) 自動激活。本文系統講解創建語法、六種類型、變量作用域、NEW/OLD 伪表、執行順序與事務交互、管理命令及經典實戰場景。
CREATE TRIGGER trigger_name
trigger_time trigger_event ON tbl_name
FOR EACH ROW
trigger_stmt
trigger_time:BEFORE | AFTERtrigger_event:INSERT | UPDATE | DELETEtrigger_stmt:單條 SQL 或 BEGIN ... END 塊。LOAD DATA 等同批量 INSERT,觸發 INSERT 型觸發器。REPLACE:若主鍵/唯一鍵衝突,先 DELETE 再 INSERT,觸發 DELETE + INSERT 型觸發器。DELIMITER $$
CREATE TRIGGER tri_stuInsert AFTER INSERT ON student
FOR EACH ROW
BEGIN
DECLARE c INT;
SET c = (SELECT stuCount FROM class WHERE classID = NEW.classID);
UPDATE class SET stuCount = c + 1 WHERE classID = NEW.classID;
END$$
DELIMITER ;
DELIMITER $$ 臨時修改語句結束符,避免內部分號被誤判為結束。$$ 結尾。DECLARE var_name [, ...] type [DEFAULT value];
SET var_name = expr [, var_name = expr] ...
BEGIN ... END 內有效,無 @ 前綴。@var) 跨觸發器可見,慎用避免污染。| 觸發類型 | NEW | OLD |
|---|---|---|
| INSERT | 新行數據 (可修改,BEFORE 中修改影響寫入) | 不可用 |
| UPDATE | 新數據 (可修改) | 舊數據 (只讀) |
| DELETE | 不可用 | 被刪行數據 (只讀) |
引用方式:NEW.col_name、OLD.col_name。
BEFORE 觸發器執行AFTER 觸發器執行 (若 DML 失敗,AFTER 不觸發)⚠️ 觸發器內不能顯式提交/回滾事務,也不能調用會隱式提交的語句 (如
LOCK TABLES、DDL)。
SHOW TRIGGERS [FROM db_name];
DROP TRIGGER [IF EXISTS] [db_name.]trigger_name;
CREATE TABLE audit_log (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
table_name VARCHAR(64),
operation ENUM('INSERT','UPDATE','DELETE'),
old_data JSON,
new_data JSON,
op_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
DELIMITER $$
CREATE TRIGGER trg_user_audit AFTER UPDATE ON `user`
FOR EACH ROW
BEGIN
INSERT INTO audit_log (table_name, operation, old_data, new_data)
VALUES ('user', 'UPDATE',
JSON_OBJECT('id', OLD.id, 'name', OLD.name, 'email', OLD.email),
JSON_OBJECT('id', NEW.id, 'name', NEW.name, 'email', NEW.email)
);
END$$
DELIMITER ;
--triggers 參數,mysqldump 默認包含觸發器。