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

Oracle 設定自增主鍵完整教學:Sequence、Trigger 與 Identity Column 對比

     編輯:Oracle 資料庫相關知識

本文以建表 → 建 Sequence → 建 Trigger → 測試插入的完整流程,詳細講解 Oracle 傳統自增主鍵實現,並補充 12c+ Identity Column 新語法、Sequence 進階參數與效能優化建議。

完整實作步驟(傳統方案)

1. 建立測試表

CREATE TABLE example (
  id      NUMBER(4) NOT NULL PRIMARY KEY,
  name    VARCHAR2(25),
  phone   VARCHAR2(10),
  address VARCHAR2(50)
);

2. 建立 Sequence

CREATE SEQUENCE emp_sequence
  INCREMENT BY 1      -- 每次遞增 1
  START WITH 1        -- 從 1 開始
  NOMAXVALUE          -- 無上限
  NOCYCLE             -- 不循環
  NOCACHE;            -- 不緩存(無間隙需求時用 CACHE 20+)

參數權衡:

  • CACHE 20:SGA 預分配 20 個值,效能提升明顯,但 Crash 會丟失未用值產生間隙。
  • NOCACHE:每次從磁碟讀取,無間隙,高併發下序列鎖成為瓶頸。
  • ORDER:RAC 環境強制全域有序,需跨實例協調,效能大幅下降,非嚴格業務需求勿用。

3. 建立 Trigger

CREATE OR REPLACE TRIGGER trg_example_pk
BEFORE INSERT ON example
FOR EACH ROW
WHEN (NEW.id IS NULL)  -- 僅在未提供 ID 時自動賦值
BEGIN
  SELECT emp_sequence.NEXTVAL INTO :NEW.id FROM dual;
END;
/

4. 測試插入

INSERT INTO example (name, phone, address) VALUES ('Cao', '56498543', 'Heibei');
INSERT INTO example (name, phone, address) VALUES ('Li', '13800138000', 'Beijing');
SELECT * FROM example;

ID NAME PHONE      ADDRESS
-- ---- ---------- -------
 1 Cao  56498543   Heibei
 2 Li   13800138000 Beijing

Sequence 核心操作速查

操作語法說明
取得下一值seq.NEXTVAL遞增並返回新值
取得當前值seq.CURRVAL返回當前 Session 最後取得的值,需先用過 NEXTVAL
修改參數ALTER SEQUENCE seq INCREMENT BY 10 MAXVALUE 10000 CYCLE NOCACHE;不可修改 START WITH,需重建
刪除序列DROP SEQUENCE seq;

Sequence 可用/不可用場景

  • 可用:單表 SELECT、INSERT VALUES、INSERT 子查詢、UPDATE SET。
  • 不可用:包含子查詢/Snapshot/View 的 SELECT、WHERE/GROUP BY/ORDER BY、DISTINCT/UNION、DEFAULT 值、CHECK 約束。

12c+ Identity Column 原生方案(推薦新專案)

-- 永遠自動產生,不允許手工指定
CREATE TABLE t1 (
  id NUMBER GENERATED ALWAYS AS IDENTITY,
  col VARCHAR2(10)
);

-- 允許手工覆蓋(DEFAULT ON NULL 同義)
CREATE TABLE t2 (
  id NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY,
  col VARCHAR2(10)
);

-- 遷移既有 Sequence+Trigger 表
ALTER TABLE example MODIFY id GENERATED ALWAYS AS IDENTITY;
DROP TRIGGER trg_example_pk;
DROP SEQUENCE emp_sequence;

優勢:DDL 可見、無 Trigger 開銷、支援 ALTER TABLE ... MODIFY 參數調整、Data Pump 導出導入自動保留屬性。

實戰優化建議

  1. 高併發核心表:CACHE 1000 + NOORDER + Identity Column。
  2. 跨庫同步/合併:預留 Sequence 範圍(如庫 A 1-100萬,庫 B 1000001-200萬)或使用 GUID/UUID。
  3. 審計需連續無間隙:業務層維護單獨流水號欄位,勿依賴 Sequence/PK。
  4. RAC 環境:NOORDER 是預設且推薦,ORDER 僅用於極少數法規強制要求的場景。

Sequence 產生的值只保證唯一、遞增,不保證連續。間隙是分散式系統的常態,業務邏輯切勿依賴連續性。

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