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

Oracle 觸發器實作自動遞增主鍵:BEFORE INSERT ROW LEVEL

     編輯:Oracle 資料庫基礎

需求

在資料表 TEST_TABLE 插入資料時,自動從 Sequence SEQ_SA_DATA 取值填入 ID 欄位。

觸發器程式碼

CREATE OR REPLACE TRIGGER autoInsertSeq_stock_info_dayly
BEFORE INSERT ON test_table
FOR EACH ROW
DECLARE
    next_data_id NUMBER;
BEGIN
    SELECT seq_sa_data.NEXTVAL
    INTO next_data_id
    FROM DUAL;

    :NEW.id := next_data_id;
END;
/

關鍵點解析

子句說明
BEFORE INSERT在 INSERT 執行前觸發,可修改 :NEW 欄位值。
FOR EACH ROW列級觸發器,每插入一列執行一次。
:NEW.id參考新列的 ID 欄位,指派值後將寫入資料表。
SELECT ... NEXTVAL FROM DUAL取得 Sequence 下一值,Oracle 11g+ 也可直接 :NEW.id := seq_sa_data.NEXTVAL;(無需 SELECT INTO)。

進階:Oracle 12c Identity Column 替代方案

CREATE TABLE test_table (
    id NUMBER GENERATED ALWAYS AS IDENTITY,
    col1 VARCHAR2(100),
    ...
);

12c 起內建 Identity Column,無需 Sequence + Trigger,效能更佳、語法更簡潔。

注意事項

  • 觸發器內避免複雜邏輯,影響大量插入效能。
  • 若有 BULK INSERT 或 FORALL,觸發器仍逐列執行,Sequence 正常遞增。
  • 確認 Sequence 已建立且具備 SELECT 權限。
  • 若表有多個觸發器,執行順序不可預期,建議合併邏輯或使用 FOLLOWS 指定順序(11g+)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved