觸發器中引用觸發表欄位時,必須使用 NEW. 或 OLD. 前綴,直接寫欄位名會報 [1054] Unknown column 'xxx' in 'where clause'。本文以實際報錯案例說明正確寫法。
CREATE TRIGGER `delete_actdata` BEFORE DELETE ON `actdata`
FOR EACH ROW
BEGIN
DELETE FROM `great` WHERE `great`.`actid` = `actid`; -- ❌ 錯誤
DELETE FROM `join` WHERE `join`.`actid` = `actid`; -- ❌
DELETE FROM `get` WHERE `get`.`actid` = `actid`; -- ❌
...
END;
報錯:Unknown column 'actid' in 'where clause' —— 觸發器上下文中無裸欄位名 actid。
CREATE TRIGGER `delete_actdata` BEFORE DELETE ON `actdata`
FOR EACH ROW
BEGIN
DELETE FROM `great` WHERE `great`.`actid` = OLD.`actid`; -- ✅ 刪除前舊值
DELETE FROM `join` WHERE `join`.`actid` = OLD.`actid`; -- ✅
DELETE FROM `get` WHERE `get`.`actid` = OLD.`actid`; -- ✅
DELETE FROM `signup` WHERE `signup`.`actid` = OLD.`actid`; -- ✅
DELETE FROM `vote_option` WHERE `vote_option`.`actid` = OLD.`actid`; -- ✅
DELETE FROM `vote_users` WHERE `vote_users`.`actid` = OLD.`actid`; -- ✅
END;
| 觸發時機 | 可用別名 | 說明 |
|---|---|---|
| BEFORE INSERT | NEW | 即將插入的新行 |
| AFTER INSERT | NEW | 已插入的新行 |
| BEFORE UPDATE | OLD, NEW | 更新前舊值、更新後新值 |
| AFTER UPDATE | OLD, NEW | 同上 |
| BEFORE DELETE | OLD | 即將刪除的舊行 |
| AFTER DELETE | OLD | 已刪除的舊行 |
NEW./OLD.。`col`,避免保留字衝突。BEFORE DELETE 僅能用 OLD,不可用 NEW。ON DELETE CASCADE 往往比觸發器更簡潔高效。