首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL觸發器實戰指南:創建/查看/刪除、BEFORE/AFTER時機、行級觸發、DELIMITER陷阱與信息_schema檢視

     編輯:MySQL 資料庫相關知識

觸發器本質

行級事件驅動程序:INSERT/UPDATE/DELETE操作觸發,FOR EACH ROW逐行執行。不支持語句級觸發(如每條SQL執行一次)。

創建語法

單語句觸發器

CREATE TRIGGER trig_name 
{BEFORE | AFTER} {INSERT | UPDATE | DELETE}
ON table_name FOR EACH ROW
trigger_stmt;

多語句觸發器(需DELIMITER)

DELIMITER ||
CREATE TRIGGER trig_name 
BEFORE DELETE ON work FOR EACH ROW
BEGIN
    INSERT INTO time VALUES (NOW());
    INSERT INTO time VALUES (NOW());
END ||
DELIMITER ;

DELIMITER陷阱:MySQL默認分號結束語句,觸發器體內部需分號分隔語句,**必須臨時修改分隔符**(如||、$$),創建完成後**立即恢復分號**。

時機選擇:BEFORE vs AFTER

時機可訪問NEW/OLD可修改NEW典型用途
BEFORENEW(INSERT/UPDATE), OLD(UPDATE/DELETE)是數據驗證、自動填充、格式化、阻止操作(SIGNAL)
AFTERNEW(INSERT/UPDATE), OLD(UPDATE/DELETE)否審計日誌、異步通知、統計表維護、級聯操作

NEW/OLD伪表:NEW.col新值,OLD.col舊值。INSERT無OLD,DELETE無NEW。

查看觸發器

SHOW TRIGGERS(基礎信息,不支持按名過濾)

SHOW TRIGGERS\G;

information_schema.triggers(完整信息,支持精確查詢)

SELECT * FROM information_schema.triggers 
WHERE TRIGGER_SCHEMA='db_name' AND TRIGGER_NAME='trig_name'\G

返回字段:TRIGGER_NAME, EVENT_MANIPULATION, EVENT_OBJECT_TABLE, ACTION_TIMING, ACTION_STATEMENT, DEFINER, CHARACTER_SET_CLIENT, COLLATION_CONNECTION等。

刪除觸發器

DROP TRIGGER [IF EXISTS] trig_name;
-- 或指定庫
DROP TRIGGER db_name.trig_name;

最佳實踐與避坑

  1. 業務邏輯勿過度依賴觸發器:隱式、難調試、遷移困難。核心業務放應用層/存儲過程
  2. 避免觸發器鏈:A觸發器修改B表→觸發B觸發器→修改C表... 難追蹤、易死循環
  3. 異常處理:BEFORE中SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='...'主動拋錯阻止操作
  4. 性能影響:大批量DML時觸發器逐行執行,嚴重拖慢速度。考慮DISABLE TRIGGER(需SUPER權限)或應用層批量處理
  5. 備份/遷移:mysqldump --triggers導出,遷移時注意DEFINER權限問題

觸發器是數據庫內部自動化的雙刃劍,用於審計、同步、約束輔助等輔助性場景,核心業務邏輯**堅決不放**觸發器。

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