承接《MySQL 學習心得》系列,本篇將深入探討 MySQL 觸發器的核心概念與實作操作。觸發器是一種特殊的預存程序,它不需要透過 CALL 手動呼叫,而是當資料表發生特定事件(INSERT、UPDATE、DELETE)時,由 MySQL 自動觸發執行。
CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt
關鍵參數說明:
BEFORE(事件前)或 AFTER(事件後)INSERT、UPDATE、DELETEBEGIN ... END 包裹注意事項:同一資料表、相同觸發時間與事件,只能建立一個觸發器。例如無法建立兩個 BEFORE UPDATE 觸發器,但可同時擁有 BEFORE UPDATE 與 AFTER UPDATE。
CREATE TABLE account(acct_num INT, amount DECIMAL(10,2)); CREATE TRIGGER ins_sum BEFORE INSERT ON account FOR EACH ROW SET @sum = @sum + NEW.amount;
此觸發器在資料寫入 account 表前,自動累加新資料的 amount 欄位值。
DELIMITER | CREATE TRIGGER testref BEFORE INSERT ON test1 FOR EACH ROW BEGIN INSERT INTO test2 SET a2 = NEW.a1; DELETE FROM test3 WHERE a3 = NEW.a1; UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1; END | DELIMITER ;
使用 DELIMITER 變更結束符號,避免與程序內部的分號衝突。
兩種主要方式:
SHOW TRIGGERS; 快速列出所有觸發器摘要information_schema.TRIGGERS 表獲取完整定義:SELECT * FROM information_schema.TRIGGERS WHERE TRIGGER_NAME = 'ins_sum';
回傳欄位包含 ACTION_STATEMENT(執行語句)、ACTION_TIMING(BEFORE/AFTER)、EVENT_MANIPULATION(INSERT/UPDATE/DELETE)等關鍵資訊。
DROP TRIGGER [schema_name.]trigger_name
若省略 schema,預設從目前資料庫移除。範例:DROP TRIGGER `school`.`ins_sum`;
NEW.column 存取新資料OLD.column 為舊值,NEW.column 為新值OLD.column 存取被刪除資料觸發器是實現資料完整性、審計日誌、跨表同步等業務邏輯的利器。善用 BEFORE 可攔截異常資料,AFTER 適合後續處理。記住:同一表、同一事件、同一時機只能有一個觸發器,設計時請統籌規劃。
