CREATE TRIGGER trigger_name trigger_time trigger_event
ON tbl_name FOR EACH ROW trigger_stmt
trigger_time:BEFORE / AFTERtrigger_event:INSERT / UPDATE / DELETEBEGIN ... END 包裹多條 SQL,支持 IF/ELSE、循環等流程控制。OLD(唯讀)與 NEW(可寫)引用行數據:INSERT 只有 NEW,DELETE 只有 OLD,UPDATE 兩者皆有。SHOW TRIGGERS; -- 全庫
SHOW TRIGGERS FROM db LIKE 'pat%'; -- 指定庫模糊
SELECT * FROM information_schema.TRIGGERS WHERE TRIGGER_NAME='xxx'\G; -- 詳情
DROP TRIGGER [schema_name.]trigger_name; -- 刪除
| 場景 | 結果 | 源碼邏輯 |
|---|---|---|
| BEFORE 觸發器失敗 | 主 SQL 不執行,直接跳轉錯誤處理 | process_triggers(BEFORE) 失敗 → goto err2 |
| 主 SQL 執行失敗 | AFTER 觸發器不執行 | update_row 失敗 → goto err,跳過 AFTER |
| AFTER 觸發器失敗 | 主 SQL 回滾(InnoDB) | process_triggers(AFTER) 失敗 → goto err2 → 事務標記回滾 |
非事務引擎(MyISAM)無法回滾,失敗前的更改已生效。
源碼顯示:for (cur_table=update_tables; ...) 依次處理每張表的 BEFORE → UPDATE → AFTER。
結論:多表 UPDATE 時,觸發器見到的「其他表數據」取決於該表在更新順序中的位置。
最佳實踐:避免在觸發器中查詢同一 SQL 正在更新的其他表;拆分為單表操作或應用層協調。
Slave_SQL_Running: No)。觸發器建在 test_info 上,SQL 先更新 test_info 再更新 wext2,AFTER 觸發器讀 wext2 仍是舊值。調換表順序即可讀到新值。
該版本 Bug:修改表結構時 information_schema.TRIGGERS 記錄被誤刪。5.0.45 已修復。
主庫 DROP TABLE wnegative 同步到從庫,觸發器隨表消失。重建表不會自動恢復觸發器,需重新 CREATE TRIGGER。