SEQUENCE是Oracle提供的自動生成唯一序列號的數據庫對象,常用於主鍵生成、單據編號等有序號碼場景。每次調用NEXTVAL自動遞增,支持緩存機制提升性能。
CREATE SEQUENCE需具備CREATE SEQUENCE或CREATE ANY SEQUENCE權限。
CREATE SEQUENCE emp_sequence
INCREMENT BY 1 -- 步長,可負數(遞減序列)
START WITH 1 -- 起始值
NOMAXVALUE -- 無上限(或 MAXVALUE 999999)
NOCYCLE -- 到達極值不循環(或 CYCLE 循環)
CACHE 10; -- 內存預取10個值,提升性能
| 參數 | 默認值 | 說明 |
|---|---|---|
| INCREMENT BY | 1 | 正數遞增、負數遞減,不可為0 |
| START WITH | 1 / -1 | 遞增序列默認1,遞減默認-1 |
| MAXVALUE / NOMAXVALUE | NOMAXVALUE | 遞增上限1027-1,遞減上限-1 |
| MINVALUE / NOMINVALUE | NOMINVALUE | 遞減下限-1026,遞增下限1 |
| CYCLE / NOCYCLE | NOCYCLE | 循環會從MINVALUE/MAXVALUE重新開始,主鍵場景禁用 |
| CACHE / NOCACHE | CACHE 20 | 預分配內存,實例異常關閉導致間隙(跳號) |
| ORDER / NOORDER | NOORDER | RAC環境強制順序生成,單實例無影響 |
NEXTVAL 與 CURRVALemp_sequence.NEXTVAL:遞增並返回新值(首次調用返回START WITH值)。emp_sequence.CURRVAL:返回當前會話最後生成的值(必須先調用過NEXTVAL,否則報ORA-08002)。SELECT列表INSERT的VALUES子句或子查詢UPDATE的SET子句-- 插入新員工,主鍵自動取序列值
INSERT INTO emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
VALUES (emp_sequence.NEXTVAL, 'LEWIS', 'CLERK', 7902, SYSDATE, 1200, NULL, 20);
-- 查詢剛插入的序列值
SELECT emp_sequence.CURRVAL FROM DUAL;
INSERT ... VALUES (seq.NEXTVAL, seq.NEXTVAL)會產生兩個連續號碼。SHUTDOWN ABORT或實例崩潰會丟失緩存值。關鍵業務(如發票號)建議NOCACHE。ALTER SEQUENCE需為擁有者或具備ALTER ANY SEQUENCE權限。不可修改START WITH,需DROP重建。
ALTER SEQUENCE emp_sequence
INCREMENT BY 10
MAXVALUE 10000
CYCLE
NOCACHE;
DROP SEQUENCE order_seq;
SEQUENCE_CACHE_ENTRIES:控制可同時緩存的序列數量(實例級)。
CACHE(如1000),減少序列鎖競爭。ORDER保證全局有序,或採用CACHE + NOORDER配合應用層邏輯接受間隙。MAX(id)+1串行化或單獨序列表+行鎖。Sequence是Oracle高性能主鍵生成的首選。理解CACHE與NOCACHE的權衡、CYCLE的風險、RAC下ORDER的代價,能讓你在設計時做出正確選型。