觸發器是與表綁定的數據庫對象,由 INSERT/UPDATE/DELETE 事件激活自動執行。不支持 SELECT、TRUNCATE、DDL 觸發。常用於:
CREATE TRIGGER trigger_name BEFORE | AFTER trigger_event ON table_name FOR EACH ROW trigger_stmt;
CREATE TRIGGER trigger_name
BEFORE | AFTER trigger_event
ON table_name
FOR EACH ROW
BEGIN
stmt1;
stmt2;
END;
BEFORE:行變更前執行(可修改 NEW 值)AFTER:行變更後執行(不可修改 NEW)FOR EACH ROW:行級觸發(MySQL 僅支持行級)trg_{table}_{event}_{timing} 如 trg_user_insert_afterDELIMITER $$ ... END $$ DELIMITER ;DELIMITER $$
CREATE TRIGGER trg_dept_audit_after
AFTER INSERT ON t_dept
FOR EACH ROW
BEGIN
INSERT INTO t_audit_log (table_name, action, log_time)
VALUES ('t_dept', 'INSERT', NOW());
END $$
DELIMITER ;
DELIMITER $$
CREATE TRIGGER trg_emp_count_after_insert
AFTER INSERT ON t_employee
FOR EACH ROW
BEGIN
UPDATE t_dept SET emp_count = emp_count + 1 WHERE deptno = NEW.deptno;
END $$
CREATE TRIGGER trg_emp_count_after_delete
AFTER DELETE ON t_employee
FOR EACH ROW
BEGIN
UPDATE t_dept SET emp_count = emp_count - 1 WHERE deptno = OLD.deptno;
END $$
DELIMITER ;
-- 方法1:SHOW 命令 SHOW TRIGGERS\G; -- 方法2:信息模式表(可篩選) USE information_schema; SELECT * FROM TRIGGERS WHERE TRIGGER_SCHEMA='mydb'\G; SELECT * FROM TRIGGERS WHERE TRIGGER_NAME='trg_dept_audit_after'\G;
DROP TRIGGER [IF EXISTS] trigger_name;
| 事件 | OLD | NEW |
|---|---|---|
| INSERT | 不可用 | 可讀/可寫 (BEFORE) |
| UPDATE | 可讀 | 可讀/可寫 (BEFORE) |
| DELETE | 可讀 | 不可用 |
NO SQL)START TRANSACTION/COMMIT/ROLLBACKSET SESSION sql_log_bin=0; (需 SUPER 權限)觸發器增加寫入延遲,每行額外執行邏輯。高併發寫入表建議:
AFTER 而非 BEFORE 減少鎖持有時間