建立觸發器語法
CREATE TRIGGER trigger_name trigger_time trigger_event
ON tbl_name FOR EACH ROW
BEGIN
trigger_stmt
END;
參數詳解
| 子句 | 說明 | 可選值 |
trigger_name | 觸發器名稱,建議規範:t_動作_表_時機_事件,如 t_upd_user_bfr_upd | 唯一識別字串 |
trigger_time | 觸發時機 | BEFORE / AFTER |
trigger_event | 觸發事件 | INSERT / UPDATE / DELETE |
tbl_name | 關聯永久表(不可為 TEMPORARY 表或視圖) | 表名 |
FOR EACH ROW | 行級觸發(MySQL 僅支援行級) | 固定 |
trigger_stmt | 執行語句,可用 BEGIN ... END 包含多句 | SQL 語句 |
OLD / NEW 列引用規則
INSERT:僅 NEW 合法(新行資料)。
DELETE:僅 OLD 合法(舊行資料)。
UPDATE:OLD(更新前)、NEW(更新後)皆可用。
- 引用方式:
NEW.column_name、OLD.column_name。
刪除觸發器
DROP TRIGGER [schema_name.]trigger_name;
權限與限制
- 需
TRIGGER 權限(MySQL 5.1+ 需 SUPER,5.7+ 獨立 TRIGGER 權限)。
- 同一表、同一時機、同一事件只能有一個觸發器(如不能有兩個
BEFORE UPDATE)。
INSERT ... ON DUPLICATE KEY UPDATE 會依序觸發 BEFORE INSERT、AFTER INSERT 或 BEFORE UPDATE/AFTER UPDATE。
快速範例
DELIMITER //
CREATE TRIGGER t_ins_user_bfr_ins
BEFORE INSERT ON `user`
FOR EACH ROW
BEGIN
INSERT INTO user_log (user_id, action) VALUES (NEW.id, 'INSERT');
END//
DELIMITER ;