Oracle 12c 引入 GENERATED AS IDENTITY 標準語法,11g 及之前版本需手工組合 **Sequence + Before Insert Trigger**。本文涵蓋兩種方案,兼容所有主流版本。
CREATE TABLE test_table (
id NUMBER NOT NULL, -- 自增主鍵
name VARCHAR2(40)
);
CREATE SEQUENCE seq_test_table
MINVALUE 1
MAXVALUE 999999999999999999999999999
INCREMENT BY 1
START WITH 1
CACHE 20
NOORDER
NOCYCLE;
CACHE 20:預先在記憶體分配 20 個值,減少字典鎖爭用,RAC 環境建議 `NOORDER` 避免跨實例排序開銷。START WITH:若表已有資料,設為 `MAX(id)+1`。CREATE OR REPLACE TRIGGER trg_test_table_pk
BEFORE INSERT ON test_table
FOR EACH ROW
BEGIN
SELECT seq_test_table.NEXTVAL INTO :NEW.id FROM dual;
END;
/
-- 測試
INSERT INTO test_table (name) VALUES ('Alice');
INSERT INTO test_table (name) VALUES ('Bob');
SELECT * FROM test_table;
-- ID 自動生成 1, 2...
-- 建表時直接定義
CREATE TABLE test_table_new (
id NUMBER GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1 CACHE 20),
name VARCHAR2(40)
);
-- 或修改現有表 (12.2+)
ALTER TABLE test_table MODIFY id GENERATED ALWAYS AS IDENTITY;
| 維度 | Sequence+Trigger | Identity Column |
|---|---|---|
| 版本相容 | 全版本 | 12c+ |
| DDL 維護 | 三個物件 (Table/Seq/Trigger) | 單一 Table |
| Context Switch | 每行觸發器呼叫 | 內核級生成,零開銷 |
| RAC 序列有序性 | 需 ORDER 選項 (效能損) | 原生有序選項 |
| 匯出/匯入 | 需同步 Sequence 值 | 自動維護 |
Sequence+Trigger 是經典通用方案,Identity Column 是現代原生標準。依據資料庫版本與遷移策略選擇,核心原理皆為「集中式單調遞增數值生成器」。