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

Oracle 與 MySQL 觸發器語法對照與實戰案例比較

     編輯:Oracle 資料庫相關知識

觸發器是資料庫內建的自動化回應機制,無需呼叫、由事件驅動、不接受參數。本文對照 Oracle PL/SQL 與 MySQL 觸發器語法差異,透過「發文自動通知好友」、「論壇貼文同步更新版面統計」兩大經典場景,展示跨平台實作差異。

觸發器核心特性

  • 獨立資料庫物件,儲存於系統目錄
  • 事件驅動:INSERT/UPDATE/DELETE 觸發
  • 無參數介面,透過 :NEW/:OLD 存取資料
  • 高效能:避免應用層往返,適合衍生資料維護

Oracle PL/SQL 觸發器語法

CREATE [OR REPLACE] TRIGGER trigger_name
{BEFORE | AFTER} {INSERT | DELETE | UPDATE [OF column...]}
ON table_name
[FOR EACH ROW]
[WHEN condition]
BEGIN
  -- trigger_body
END;

實作範例

-- 1. Hello World 級:更新 employees 印 ok
CREATE OR REPLACE TRIGGER tri_update
AFTER UPDATE ON employees
FOR EACH ROW
BEGIN
  DBMS_OUTPUT.PUT_LINE('ok');
END;

-- 2. 插入 emp 印 hello
CREATE OR REPLACE TRIGGER tri_insert
AFTER INSERT ON emp
BEGIN
  DBMS_OUTPUT.PUT_LINE('hello');
END;

-- 3. 使用 :OLD/:NEW 顯示薪資變動
CREATE OR REPLACE TRIGGER tri_salary
AFTER UPDATE ON employees
FOR EACH ROW
BEGIN
  DBMS_OUTPUT.PUT_LINE('更新前:' || :OLD.salary || ' 更新後:' || :NEW.salary);
END;

-- 測試
UPDATE employees SET salary = salary + 1 WHERE department_id = 80;

MySQL 觸發器語法

-- 建立測試表
CREATE TABLE board (
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(50),
  articleCount INT
);

CREATE TABLE article (
  id INT PRIMARY KEY AUTO_INCREMENT,
  title VARCHAR(50),
  bid INT REFERENCES board(id)
);

-- 建立觸發器:文章新增時同步更新版面計數
DELIMITER $$
CREATE TRIGGER insertArticle_trigger
AFTER INSERT ON article
FOR EACH ROW
BEGIN
  UPDATE board SET articleCount = articleCount + 1 WHERE id = NEW.bid;
END $$
DELIMITER ;

-- 測試
INSERT INTO board VALUES (NULL, 'test_boardname', 0);
INSERT INTO article VALUES (NULL, 'test_title', 1);
-- board.articleCount 自動變為 1

關鍵差異對照表

特性OracleMySQL
分隔符號處理標準 ; 結尾需 DELIMITER $$ 臨時變更
行級觸發器FOR EACH ROWFOR EACH ROW
新/舊值存取:NEW.col / :OLD.colNEW.col / OLD.col(無冒號)
多陳述式BEGIN ... END;BEGIN ... END(無分號)
條件觸發WHEN condition觸發器內部 IF 判斷

效能建議

  • 觸發器內避免複雜查詢、跨表大量更新
  • 大量資料載入時考慮暫停觸發器(ALTER TABLE ... DISABLE TRIGGER)
  • Oracle 觸發器可發動 DBMS_ALERT、AQ 實現非同步通知

掌握兩大平台觸發器語法差異,能在異構遷移、混合雲架構中遊刃有餘。

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