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

Oracle 觸發器實現自增列:跨數據庫遷移兼容的標準化模板與 12c Identity 列現代替代方案

     編輯:Oracle 教學

業務痛點

MySQL AUTO_INCREMENT、SQL Server IDENTITY(1,1)、PostgreSQL SERIAL 皆為原生自增列。Oracle 11g 及之前**無原生自增**,遷移項目需統一 DAO 層寫法,觸發器+序列是經典解法。

經典方案:序列 + BEFORE INSERT 觸發器

-- 1. 創建序列
CREATE SEQUENCE seq_t_user_id START WITH 1 INCREMENT BY 1 NOCACHE NOCYCLE;

-- 2. 創建表(無自增屬性)
CREATE TABLE t_user (
  id NUMBER PRIMARY KEY,
  name VARCHAR2(50),
  create_time DATE DEFAULT SYSDATE
);

-- 3. 觸發器:插入前自動填充 ID
CREATE OR REPLACE TRIGGER trg_t_user_bir
BEFORE INSERT ON t_user
FOR EACH ROW
WHEN (NEW.id IS NULL)  -- 關鍵:僅在應用未提供 ID 時自動賦值,兼容手動指定 ID 場景
BEGIN
  SELECT seq_t_user_id.NEXTVAL INTO :NEW.id FROM dual;
END;
/

關鍵設計細節

細節做法理由
WHEN 子句WHEN (NEW.id IS NULL)允許應用顯式指定 ID(如數據遷移、測試構造),不覆蓋
序列屬性NOCACHE 或 CACHE 20RAC 環境 NOCACHE 避免間隙;單機 CACHE 提升性能
觸發器類型BEFORE INSERT FOR EACH ROW行級、插入前、可修改 :NEW
命名規範trg__bir/biu/bdr

12c/19c/21c 現代原生方案:Identity 列

-- 12c+ 標準語法
CREATE TABLE t_user (
  id NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY PRIMARY KEY,
  name VARCHAR2(50)
);

-- 12c+ 完整選項
CREATE TABLE t_user (
  id NUMBER GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1 CACHE 20 NOORDER NOCYCLE) PRIMARY KEY,
  name VARCHAR2(50)
);

模式對比:

可讀性、易維護
模式語法行為適用場景
ALWAYSGENERATED ALWAYS AS IDENTITY**禁止**顯式插入 ID,報錯純系統生成,嚴格管控
BY DEFAULTGENERATED BY DEFAULT AS IDENTITY允許顯式插入,NULL 時自動生成兼容遷移、測試構造
BY DEFAULT ON NULLGENERATED BY DEFAULT ON NULL AS IDENTITY**僅 NULL 時自動生成**,非 NULL 時用指定值**推薦:最兼容、最靈活**

遷移兼容性策略

  1. **新建表**:直接用 GENERATED BY DEFAULT ON NULL AS IDENTITY,DAF 層無感知。
  2. **舊表改造**:ALTER TABLE t_user MODIFY id GENERATED BY DEFAULT ON NULL AS IDENTITY(12c+),自動創建關聯序列,原觸發器可保留或刪除(Identity 優先級更高)。
  3. **跨版本部署**:代碼中檢測版本 SELECT version FROM v$instance,12c+ 用 Identity,11g 用觸發器+序列,DAO 層統一不寫 ID 或寫 NULL。

性能與間隙說明

  • 序列/Identity **不保證連續無間隙**(緩存失效、回滾、實例重啟均導致間隙),**業務勿依賴連續性**。
  • 高併發插入建議 CACHE 100-1000 減少序列鎖爭用(SQ_ENQ 等待)。
  • RAC 環境序列採用 ORDER/NOORDER 權衡全局有序 vs 性能。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved