Sequence 是 Oracle 生成唯一序號的標準機制,廣泛用於主鍵、單號、流水號。本文系統整理 CREATE/ALTER/DROP SEQUENCE 語法、CURRVAL/NEXTVAL 行為、CACHE/NOCAHCE 效能與跳號權衡、初始化參數影響,附實戰範例與避坑清單。
CREATE SEQUENCE emp_seq
INCREMENT BY 1 -- 每次遞增值 (可負數遞減)
START WITH 1 -- 起始值
NOMAXVALUE -- 無上限 (或 MAXVALUE 999999)
MINVALUE 1 -- 下限 (遞減時生效)
NOCYCLE -- 到達極值報錯 (CYCLE 則循環)
CACHE 20 -- 記憶體預取 20 個 (NOCAHCE 即時寫入磁碟)
ORDER; -- RAC 環境強制全局有序 (單實例忽略)
| 屬性 | 行為 | 注意事項 |
|---|---|---|
NEXTVAL | 遞增並返回新值 | 首次返回 START WITH 值;同一 SQL 多次呼叫會產生不同值 |
CURRVAL | 返回當前會話最後 NEXTVAL 值 | **必須先呼叫過 NEXTVAL**,否則報 ORA-08002 |
SELECT 列表INSERT 的 VALUES 子句或子查詢UPDATE 的 SET 子句禁止:WHERE、GROUP BY、ORDER BY、DISTINCT、UNION、CREATE TABLE AS SELECT、DEFAULT 子句 (12c+ 可用 DEFAULT seq.NEXTVAL)。
-- 插入員工,主鍵自動取號
INSERT INTO emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
VALUES (emp_seq.NEXTVAL, 'LEWIS', 'CLERK', 7902, SYSDATE, 1200, NULL, 20);
-- 查詢剛插入的序號
SELECT emp_seq.CURRVAL FROM dual;
ALTER SEQUENCE emp_seq
INCREMENT BY 10
MAXVALUE 10000
CYCLE
NOCACHE;
INCREMENT BY、MAXVALUE/MINVALUE、CYCLE/NOCYCLE、CACHE/NOCACHE、ORDER/NOORDERSTART WITH —— 必須 DROP 重建CACHE n 讓實例在 SGA 預先分配 n 個序號,用完再取下一批。單實例效能提升顯著;RAC 下各實例各自快取,導致全局序號「不連續但單調遞增」。
SHUTDOWN ABORT / 實例崩潰:記憶體中未用完的快取序號永久丟失ALTER SEQUENCE ... NOCACHE 切換時| 場景 | 建議 | 理由 |
|---|---|---|
| 高併發主鍵 (單實例) | CACHE 100~1000 | 極大減少序號鎖爭用 |
| 單據號、發票號 (業務要求連續) | NOCACHE 或 CACHE 10 + 彌補機制 | 減少跳號;嚴格連續請用表鎖+最大值+1 |
| RAC 環境需全局有序 | CACHE 100 ORDER | ORDER 強制跨實例協調,略降效能 |
SEQUENCE_CACHE_ENTRIES:單實例可同時快取的 Sequence 數量上限 (預設 100/200 視版本)DROP SEQUENCE order_seq;
INSERT ... VALUES (seq.NEXTVAL, seq.NEXTVAL) 會插入兩個不同號Sequence 是 Oracle 高併發唯一值生成的基石。**高併發用大 CACHE、業務連續用 NOCACHE、RAC 加 ORDER、備份後手動推進序號**。掌握這四條鐵律,即可游刃有餘應對各類編號需求。