行級事件驅動程序:INSERT/UPDATE/DELETE操作觸發,FOR EACH ROW逐行執行。不支持語句級觸發(如每條SQL執行一次)。
CREATE TRIGGER trig_name
{BEFORE | AFTER} {INSERT | UPDATE | DELETE}
ON table_name FOR EACH ROW
trigger_stmt;
DELIMITER ||
CREATE TRIGGER trig_name
BEFORE DELETE ON work FOR EACH ROW
BEGIN
INSERT INTO time VALUES (NOW());
INSERT INTO time VALUES (NOW());
END ||
DELIMITER ;
DELIMITER陷阱:MySQL默認分號結束語句,觸發器體內部需分號分隔語句,**必須臨時修改分隔符**(如||、$$),創建完成後**立即恢復分號**。
| 時機 | 可訪問NEW/OLD | 可修改NEW | 典型用途 |
|---|---|---|---|
| BEFORE | NEW(INSERT/UPDATE), OLD(UPDATE/DELETE) | 是 | 數據驗證、自動填充、格式化、阻止操作(SIGNAL) |
| AFTER | NEW(INSERT/UPDATE), OLD(UPDATE/DELETE) | 否 | 審計日誌、異步通知、統計表維護、級聯操作 |
NEW/OLD伪表:NEW.col新值,OLD.col舊值。INSERT無OLD,DELETE無NEW。
SHOW TRIGGERS\G;
SELECT * FROM information_schema.triggers
WHERE TRIGGER_SCHEMA='db_name' AND TRIGGER_NAME='trig_name'\G
返回字段:TRIGGER_NAME, EVENT_MANIPULATION, EVENT_OBJECT_TABLE, ACTION_TIMING, ACTION_STATEMENT, DEFINER, CHARACTER_SET_CLIENT, COLLATION_CONNECTION等。
DROP TRIGGER [IF EXISTS] trig_name;
-- 或指定庫
DROP TRIGGER db_name.trig_name;
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='...'主動拋錯阻止操作DISABLE TRIGGER(需SUPER權限)或應用層批量處理mysqldump --triggers導出,遷移時注意DEFINER權限問題觸發器是數據庫內部自動化的雙刃劍,用於審計、同步、約束輔助等輔助性場景,核心業務邏輯**堅決不放**觸發器。