萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL Trigger 觸發器完整教學:從入門到實戰同步雙表

觸發器是綁定在表上的特殊存儲程序,當 INSERT/UPDATE/DELETE 發生時自動執行,具備自動性與事務一致性。本文從四要素、語法、實戰同步雙表、刪除/修改觸發器、優缺點分析五個維度完整講解。

為什麼使用觸發器?

  • 自動性:業務邏輯(如冗餘欄位同步、審計日誌)內建資料庫層,應用碼無需重複撰寫。
  • 資料完整性:觸發器在同一事務內執行,避免應用層「更新兩張表成功、第三張失敗」導致的不一致。

觸發器四要素

  1. 監視地點:TABLE
  2. 監視事件:INSERT / UPDATE / DELETE
  3. 觸發時機:BEFORE / AFTER
  4. 觸發動作:SQL 語句(可多條,用 BEGIN ... END 包裹)

建立語法

CREATE TRIGGER trigger_name
{BEFORE | AFTER} {INSERT | UPDATE | DELETE} ON table_name
FOR EACH ROW
BEGIN
  -- SQL statements
END;

實戰案例:訂單表觸發商品庫存同步

準備測試表

CREATE TABLE g (id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20), num INT);
CREATE TABLE o (oid INT PRIMARY KEY AUTO_INCREMENT, gid INT, much INT);
INSERT INTO g(name,num) VALUES ('商品1',10),('商品2',10),('商品3',10);

1. AFTER INSERT:下單扣庫存

DELIMITER $$
CREATE TRIGGER tg_after_insert 
AFTER INSERT ON o FOR EACH ROW
BEGIN
  UPDATE g SET num = num - NEW.much WHERE id = NEW.gid;
END$$
DELIMITER ;

2. AFTER DELETE:取消訂單回補庫存

DELIMITER $$
CREATE TRIGGER tg_after_delete
AFTER DELETE ON o FOR EACH ROW
BEGIN
  UPDATE g SET num = num + OLD.much WHERE id = OLD.gid;
END$$
DELIMITER ;

3. AFTER UPDATE:修改訂單數量差額調整

DELIMITER $$
CREATE TRIGGER tg_after_update
AFTER UPDATE ON o FOR EACH ROW
BEGIN
  UPDATE g SET num = num + OLD.much - NEW.much WHERE id = OLD.gid;
END$$
DELIMITER ;

NEW / OLD 伪表行引用規則

事件NEWOLD
INSERT新行所有欄位不可用
UPDATE修改後的值修改前的值
DELETE不可用被刪除行的值

完整同步雙表示例(t_a → t_b)

-- INSERT 同步
CREATE TRIGGER tr_a_insert AFTER INSERT ON t_a FOR EACH ROW
BEGIN
  INSERT INTO t_b (username, groupid) VALUES (NEW.username, NEW.groupid);
END;

-- UPDATE 同步(僅關鍵欄位變更時)
CREATE TRIGGER tr_a_update AFTER UPDATE ON t_a FOR EACH ROW
BEGIN
  IF NEW.groupid != OLD.groupid OR NEW.username != OLD.username THEN
    UPDATE t_b SET groupid=NEW.groupid, username=NEW.username
    WHERE username=OLD.username AND groupid=OLD.groupid;
  END IF;
END;

-- DELETE 同步
CREATE TRIGGER tr_a_delete AFTER DELETE ON t_a FOR EACH ROW
BEGIN
  DELETE FROM t_b WHERE username=OLD.username AND groupid=OLD.groupid;
END;

優缺點總結

優點缺點
業務邏輯集中、自動執行除錯困難,無單步調試、斷點
保證事務一致性隱性邏輯導致維護成本高
減少應用層往返遷移資料庫時易遺漏
可實現跨表級聯操作大量觸發器影響寫入效能

最佳實踐建議

  1. 核心業務邏輯優先用存儲過程或應用層事務,觸發器僅作輔助(審計、同步冗餘欄位)。
  2. 命名規範:tg_{table}_{event}_{timing},如 tg_order_after_insert。
  3. 避免觸發器巢狀調用(觸發器中修改另一張表又觸發其觸發器),極難追蹤。
  4. 文檔化:在資料庫字典中註明每個觸發器用途與影響範圍。

善用觸發器能簡化應用碼,但請謹記「顯式優於隱式」,關鍵路徑盡量保持在應用層可見可控。

copyright © 萬盛學電腦網 all rights reserved