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

Oracle 實作自動遞增欄位:Sequence + Trigger 完整方案

     編輯:Oracle 教學

Oracle 無原生 Identity 欄位,透過 Sequence 與 Trigger 實現自增主鍵

Oracle 12c 前無 GENERATED AS IDENTITY 語法,傳統做法是建立 SEQUENCE 產生流水號,搭配 BEFORE INSERT 觸發器自動填入主鍵欄位。

實作步驟

1. 建立測試表

CREATE TABLE TEMP_TEST (
  ID  NUMBER PRIMARY KEY,
  NM  VARCHAR2(10)
);

2. 建立 Sequence

CREATE SEQUENCE TEMP_TEST_IDADD
  INCREMENT BY 1
  START WITH 1
  NOCACHE
  NOCYCLE;

參數說明:INCREMENT BY 1 每次遞增 1,START WITH 1 從 1 開始,NOCACHE 不快取(確保不跳號,效能略降),NOCYCLE 不循環。

3. 建立 Trigger

CREATE OR REPLACE TRIGGER T_TEMP_TEST_IDADD
BEFORE INSERT ON TEMP_TEST
FOR EACH ROW
BEGIN
  SELECT TEMP_TEST_IDADD.NEXTVAL INTO :NEW.ID FROM DUAL;
END T_TEMP_TEST_IDADD;
/
-- 或簡寫(11g+)
-- :NEW.ID := TEMP_TEST_IDADD.NEXTVAL;

4. 測試驗證

INSERT INTO TEMP_TEST (NM) VALUES ('ss');
INSERT INTO TEMP_TEST (NM) VALUES ('ss');

SELECT * FROM TEMP_TEST;
-- 結果:
-- ID  NM
-- --  --
-- 1   ss
-- 2   ss

自增測試結果圖

進階補充

Oracle 12c+ 原生 Identity 欄位

CREATE TABLE TEST_ID (
  ID  NUMBER GENERATED ALWAYS AS IDENTITY,
  NM  VARCHAR2(10)
);

或允許手動覆寫:

CREATE TABLE TEST_ID (
  ID  NUMBER GENERATED BY DEFAULT AS IDENTITY,
  NM  VARCHAR2(10)
);

Sequence 快取與效能

  • CACHE 20(預設)可大幅提升高併發插入效能,但實例重啟會導致號碼跳躍
  • ORDER 保證 RAC 環境下跨節點序號有序,效能稍低

觸發器效能考量

  • 每筆 INSERT 觸發一次 Context Switch,極高併發下可考慮應用層直接 SELECT seq.NEXTVAL FROM DUAL 後再 INSERT
  • 批次匯入時可暫時 DISABLE TRIGGER,改由匯入腳本指定 ID

Sequence + Trigger 是 Oracle 傳統自增主鍵標準做法,相容性最好;12c 以上新專案建議直接使用 Identity 欄位簡化維護。

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