萬盛學電腦網

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

MySQL 觸發器完整教學:建立、查看、刪除、BEFORE/AFTER 陷阱與實戰範例

MySQL 觸發器:事件驅動的自動化資料維護

觸發器綁定 INSERT、UPDATE、DELETE 事件,在 BEFORE 或 AFTER 階段自動執行 SQL 邏輯,適用於審計日誌、衍生欄位計算、跨表同步等場景。

建立觸發器語法

CREATE TRIGGER trigger_name
{BEFORE | AFTER} {INSERT | UPDATE | DELETE}
ON table_name
FOR EACH ROW
BEGIN
  -- 多語句用 BEGIN...END 包裹
  trigger_statements;
END;

關鍵概念:NEW 與 OLD 偽表

經典陷阱:同表遞迴觸發

❌ 錯誤範例: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
事件NEWOLD
INSERT✅ 新行資料❌ 無
UPDATE✅ 更新後資料✅ 更新前資料
DELETE❌ 無✅ 被刪資料