首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 觸發器全解析:創建語法、類型區分、查看管理與實戰避坑

     編輯:MySQL 綜合教學

MySQL 觸發器全解析:創建語法、類型區分、查看管理與實戰避坑

觸發器是資料庫層面的「事件驅動編程」,能在 DML 操作前後自動執行預定義邏輯。本文系統梳理 MySQL 觸發器的創建語法(單/多語句)、觸發時機(BEFORE/AFTER)、行級語義、元數據查看與刪除管理,並給出生產環境常見陷阱與替代方案建議。

一、核心概念與觸發模型

  • 觸發事件:INSERT、UPDATE、DELETE(不支援 DDL、TRUNCATE、REPLACE 直接觸發)
  • 觸發時機:BEFORE(寫入前,可修改 NEW 值)、AFTER(寫入後,不可修改 NEW)
  • 粒度:行級(FOR EACH ROW),MySQL 不支援語句級觸發器
  • 上下文變數:OLD.col(舊值,UPDATE/DELETE 可用)、NEW.col(新值,INSERT/UPDATE 可用)

二、創建語法詳解

2.1 單語句觸發器

CREATE TRIGGER trigger_name
BEFORE | AFTER INSERT | UPDATE | DELETE
ON table_name
FOR EACH ROW
single_statement;

範例:插入前自動補全創建時間

CREATE TRIGGER trg_article_bi
BEFORE INSERT ON article
FOR EACH ROW
SET NEW.created_at = NOW();

2.2 多語句觸發器

CREATE TRIGGER trigger_name
BEFORE | AFTER INSERT | UPDATE | DELETE
ON table_name
FOR EACH ROW
BEGIN
  statement_1;
  statement_2;
  ...
END;

範例:更新後同步審計日誌

CREATE TRIGGER trg_user_au
AFTER UPDATE ON user
FOR EACH ROW
BEGIN
  IF NEW.status <> OLD.status THEN
    INSERT INTO user_status_log(uid, old_status, new_status, changed_at)
    VALUES (NEW.id, OLD.status, NEW.status, NOW());
  END IF;
END;

三、查看與管理

操作SQL關鍵輸出
列出所有觸發器SHOW TRIGGERS [FROM db_name] [LIKE 'pattern'];Trigger, Event, Table, Statement, Timing, Created, sql_mode, Definer
查看定義詳情SHOW CREATE TRIGGER trigger_name;完整 CREATE 語句、字符集、定義者
元數據查詢SELECT * FROM information_schema.TRIGGERS WHERE TRIGGER_SCHEMA='db';可程式化篩選、導出、對比
刪除觸發器DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name;需 TRIGGER 權限

四、實戰避坑指南與最佳實踐

  1. ❌ 避免在觸發器中做重 I/O 操作:發送郵件、HTTP 呼叫、大批量寫入 → 改用異步消息隊列(Kafka/RocketMQ)+ 消費者處理
  2. ❌ 避免觸發器鏈式調用:Trigger A 修改表 B → 觸發 Trigger B → 修改表 C → ... 極難除錯、效能不可控 → 改用應用層領域事件或存儲過程封裝
  3. ❌ 避免在 BEFORE 觸發器中修改其他表:若主操作回滾,副作用已發生 → 數據不一致風險
  4. ✅ 善用 BEFORE 校驗與補全:資料清洗、預設值填充、業務規則攔截(SIGNAL SQLSTATE '45000' 拋錯阻斷)
  5. ✅ 善用 AFTER 同步衍生數據:審計日誌、匯總表維護、搜尋引擎同步(配合事務邊界)
  6. ✅ 命名規範:trg_{table}_{timing}_{event},如 trg_order_ai、trg_user_bu
  7. ✅ 版本控管:觸發器 DDL 納入遷移腳本,禁止線上手工建改

五、替代方案對比

方案優勢劣勢適用場景
觸發器資料庫強一致性、透明於應用除錯難、效能黑盒、遷移困難審計日誌、必填欄位補全、簡單衍生同步
應用層領域事件可見、可測、可重試、技術棧統一需應用配合、最終一致性複雜業務流程、跨服務同步、外部系統集成
CDC (Debezium/Canal)零侵入、全量增量、多下游分發部署複雜、延遲毫秒級異構同步、數據湖入湖、緩存失效、搜尋索引構建

觸發器是「雙刃劍」:用得好是資料完整性的守護神,用不好是效能殺手與除錯噩夢。建議只在「單表、輕邏輯、強一致性」場景克制使用,複雜業務流轉交給應用層或 CDC 架構承擔。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved