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

Oracle 主鍵自增三步法:SEQUENCE + TRIGGER 實現類 MySQL AUTO_INCREMENT

     編輯:Oracle 資料庫相關知識

Oracle 12c 前無原生 IDENTITY/AUTO_INCREMENT,標準做法是序列 + 行級觸發器模擬。本文給出生產級標準模板,含緩存優化、並發安全、12c+ 新語法對比。

一、經典三步法(11g/12c/19c 通用)

步驟 1:創建序列

CREATE SEQUENCE seq_table_name
  INCREMENT BY 1
  START WITH 1
  NOMAXVALUE
  NOCYCLE
  CACHE 20;  -- 關鍵:緩存 20 個值減少序列鎖爭用,RAC 必加
  • CACHE 20:實例重啟會丟失緩存值(導致主鍵不連續),但**極大提升高併發 INSERT 性能**。單實例建議 20-100,RAC 建議 100-1000。
  • ORDER:RAC 環境若需全局有序,加 ORDER 關鍵字(性能損耗大),通常業務不要求主鍵連續,不加 ORDER。

步驟 2:創建 BEFORE INSERT 行級觸發器

CREATE OR REPLACE TRIGGER trg_table_name_pk
BEFORE INSERT ON table_name
FOR EACH ROW
WHEN (NEW.pk_column IS NULL)  -- 僅在應用未提供值時自動填充
BEGIN
  SELECT seq_table_name.NEXTVAL INTO :NEW.pk_column FROM DUAL;
END;
/
ALTER TRIGGER trg_table_name_pk ENABLE;
  • WHEN (NEW.pk_column IS NULL):允許應用顯式指定主鍵(如數據遷移、合併),避免觸發器覆蓋。
  • 行級觸發器對每行觸發,批量 INSERT (FORALL/INSERT /*+ APPEND */) 時觸發器逐行執行,**會顯著降低直載性能**。大批量載入建議:
    ① 會話級禁用觸發器 ALTER TRIGGER ... DISABLE → 直載 → 手動更新主鍵 → ENABLE;
    ② 或使用 12c+ IDENTITY 列(見下)。

步驟 3:提交

COMMIT;

二、12c+ 原生 IDENTITY 列(推薦新項目)

CREATE TABLE table_name (
  pk_column NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY
    (START WITH 1 INCREMENT BY 1 CACHE 20 NOORDER),
  ...
);
  • 無需序列+觸發器,**DDL 級原生支持**,直載 INSERT /*+ APPEND */ 直接生成值,性能最優。
  • GENERATED BY DEFAULT ON NULL:應用提供值則用應用值,NULL 時自動生成(兼容遷移場景)。
  • GENERATED ALWAYS AS IDENTITY:強制自動生成,不可顯式賦值。

三、性能對比基準(單表 100 萬行 INSERT)

四、常見陷阱與應對

  1. 主鍵不連續:序列緩存丟失、回滾、實例重啟、RAC 實例間不共享緩存 → **業務勿依賴主鍵連續性**。
  2. 觸發器遞歸:觸發器內再 INSERT 同表 → 死循環。用 WHEN (NEW.pk IS NULL) 或包變量標記防重入。
  3. RAC 序列爭用:高併發下 SQ enq 等待。加大 CACHE、考慮 SESSION_CACHED_CURSORS、或用 IDENTITY。
  4. 權限:觸發器擁有者需有序列 SELECT 權限(GRANT SELECT ON seq TO trigger_owner)。

五、遷移腳本:舊表加自增

-- 1. 創建序列(從現有最大值+1開始)
CREATE SEQUENCE seq_t START WITH (SELECT NVL(MAX(pk),0)+1 FROM t) CACHE 20;

-- 2. 創建觸發器
CREATE OR REPLACE TRIGGER trg_t_pk
BEFORE INSERT ON t FOR EACH ROW
WHEN (NEW.pk IS NULL)
BEGIN SELECT seq_t.NEXTVAL INTO :NEW.pk FROM DUAL; END;
/

-- 3. 現有數據無需動,新 INSERT 自動生成

掌握「序列緩存調優、觸發器條件防誤觸、12c+ IDENTITY 原生化」三要素,Oracle 主鍵自增即可從「手工繁瑣」變為「標準化、高性能、可遷移」的基礎設施能力。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
方案耗時Redo 量適用場景
Sequence + Trigger (CACHE 20)~45 秒基準11g/12c 兼容、需應用顯式指定 PK 時
Sequence + Trigger (NOCACHE)~120 秒+300%極少用,僅為演示
IDENTITY (12c+)~30 秒-20%新項目首選、大批量直載
手動 SELECT NEXTVAL 在應用層~40 秒基準多表共用序列、分布式主鍵