Oracle 無原生 Auto Increment,標準做法是結合 Sequence (序列) 與 Trigger (觸發器) 實現主鍵自動產生。本文完整說明語法選項、建立範例、替代方案與效能考量。
CREATE SEQUENCE sequence_name
[INCREMENT BY n] -- 步長,預設 1,負值為遞減
[START WITH n] -- 初始值,預設 1
[{MAXVALUE n | NOMAXVALUE}] -- 最大值,遞增預設 10^27
[{MINVALUE n | NOMINVALUE}] -- 最小值,遞減預設 -10^26
[{CYCLE | NOCYCLE}] -- 到達極值是否循環,預設 NOCYCLE
[{CACHE n | NOCACHE}]; -- 記憶體快取數量,預設 20
CREATE SEQUENCE SEQ_TEST
INCREMENT BY 1
START WITH 1
MINVALUE 1 NOMAXVALUE
NOCYCLE
CACHE 20; -- 建議快取提升效能
CREATE OR REPLACE TRIGGER TRG_TEST
BEFORE INSERT ON TEST
FOR EACH ROW
BEGIN
SELECT SEQ_TEST.NEXTVAL INTO :NEW.TEST_ID FROM DUAL;
END;
/
-- 記得以 / 結束多行 PL/SQL 區塊
INSERT INTO TEST (TEST_ID, COL1, COL2)
VALUES (SEQ_TEST.NEXTVAL, 'value1', 'value2');
優點:簡單直觀,無觸發器額外開銷。缺點:需在每條 INSERT 陳述式中明確呼叫,易遺漏。
CACHE 100~1000,減少字典鎖競爭;但需接受重啟時快取值遺失造成間隙。ORDER 保證全域有序,單機 NOORDER 效能更好。GENERATED AS IDENTITY 原生支援,簡化語法並優化效能,優先考慮。SELECT SEQ_TEST.CURRVAL FROM DUAL;SELECT * FROM USER_SEQUENCES WHERE SEQUENCE_NAME='SEQ_TEST';DROP SEQUENCE SEQ_TEST;INCREMENT BY -n 配合 NEXTVAL 調整Sequence + Trigger 是 Oracle 傳統自增主鍵標準解法,掌握細節能避開效能陷阱與維護坑點。