| 事件 | NEW | OLD |
| INSERT | ✅ 新行資料 | ❌ 無 |
| UPDATE | ✅ 更新後資料 | ✅ 更新前資料 |
| DELETE | ❌ 無 | ✅ 被刪資料 |
經典陷阱:同表遞迴觸發
❌ 錯誤範例:AFTER INSERT 更新同表 → 再次觸發 AFTER INSERT → 死循環
CREATE TRIGGER SetUserHome AFTER INSERT ON users
FOR EACH ROW
BEGIN
UPDATE users SET homeX=128 WHERE uuid=NEW.uuid; -- 觸發自己!
END;
✅ 正確寫法:使用 BEFORE 直接修改 NEW 值
CREATE TRIGGER SetUserHome BEFORE INSERT ON users
FOR EACH ROW
BEGIN
SET NEW.homeX = 128;
SET NEW.homeY = 128;
SET NEW.homeZ = 30;
END;
多語句觸發器與 DELIMITER
DELIMITER ||
CREATE TRIGGER trig2 BEFORE DELETE ON work
FOR EACH ROW
BEGIN
INSERT INTO time_log VALUES(NOW(), 'DELETE', OLD.id);
INSERT INTO audit_log VALUES(NOW(), 'WORK_DELETE', OLD.id);
END
||
DELIMITER ;
查看觸發器
-- 列出所有
SHOW TRIGGERS;
-- 詳細資訊 (information_schema)
SELECT * FROM information_schema.triggers WHERE TRIGGER_NAME='trig1'\G
刪除觸發器
DROP TRIGGER [db_name.]trigger_name;
實戰應用場景
- 審計日誌:
AFTER UPDATE 記錄異動前後值
- 衍生欄位:
BEFORE INSERT/UPDATE 計算總價、狀態
- 跨表同步:
AFTER INSERT 同步統計表計數器
- 資料驗證:
BEFORE INSERT 檢查業務規則,SIGNAL SQLSTATE '45000' 拋錯阻擋
效能警示:觸發器在同一交易內執行,複雜邏輯會拉長鎖持有時間。高併發核心表**慎用觸發器**,改用應用層事件或非同步訊息佇列處理。
copyright ©
萬盛學電腦網 all rights reserved