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

MySQL 5.0 新特性教程:觸發器 (一) — 語法、觸發時機、事件、粒度

     編輯:MySQL 資料庫相關知識

程式碼呈現慣例

  • 等寬字體區分程式碼與說明
  • <-- 標示重點行
  • 範例已在 SUSE 9.2 + MySQL 5.0.3 測試通過

為什麼需要觸發器?

  • 用戶長期需求
  • ANSI SQL 標準相容
  • 資料完整性:攔截/修正壞資料寫入
  • 操作攔截:修改/取消 INSERT/UPDATE/DELETE
  • 審計追蹤:監控資料變更動作

觸發器與函數的語句限制

觸發器繼承函數限制:不可存取表 (無 SELECT/INSERT/UPDATE/DELETE 等表操作),但可使用:

  • 複合語句 BEGIN ... END
  • 流程控制:IF, CASE, WHILE, LOOP, REPEAT, LEAVE, ITERATE
  • 變數 DECLARE、指派 SET
  • 條件宣告、異常處理

語法結構

CREATE TRIGGER <觸發器名稱>
{ BEFORE | AFTER }
{ INSERT | UPDATE | DELETE }
ON <表名稱>
FOR EACH ROW
<觸發器SQL語句>

1. 命名規則

  • 最長 64 字元,可含分隔符
  • 建議慣例:表名_觸發時機_事件,如 t26_bu (表 t26, BEFORE UPDATE)

2. 觸發時機

  • BEFORE:事件前執行 (可修改 NEW 值、阻止操作)
  • AFTER:事件後執行 (不可修改 NEW,可讀取 OLD/NEW)

3. 觸發事件

  • INSERT、UPDATE、DELETE

4. 所屬表

  • 每張表、每個事件、每個時機 僅能建立一個觸發器
  • 如需多邏輯,在單一觸發器內用 IF/CASE 分流

5. 粒度

FOR EACH ROW:逐列觸發 (標準 SQL 行級觸發器)。MySQL 5.0 僅支援行級,不支援陳述式級 (FOR EACH STATEMENT)。

NEW 與 OLD 擬似資料列

事件OLDNEW
INSERT不可用新插入的列值 (BEFORE 可修改)
UPDATE更新前的列值更新後的列值 (BEFORE 可修改)
DELETE被刪除的列值不可用

存取方式:NEW.col_name、OLD.col_name

簡單範例:BEFORE INSERT 自動填充建立時間

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

警告

觸發器相對較新,可能存在缺陷。嚴禁在重要生產資料庫直接使用,請先在測試環境充分驗證。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved