Sequence 是 Oracle 提供的獨立編號產生器,不綁定特定表,支援多表共用、自定義遞增邏輯。本文涵蓋完整語法、各參數行為、CACHE 機制、循環序列、修改與刪除,以及 12c 引入的 IDENTITY 列。
CREATE SEQUENCE seq_name
[INCREMENT BY n] -- 步長,預設 1,負數為遞減
[START WITH n] -- 起始值,預設 1 (遞增) 或最大值 (遞減)
[MAXVALUE n | NOMAXVALUE] -- 最大值,預設 10^27
[MINVALUE n | NOMINVALUE] -- 最小值,預設 1 (遞增) 或 -10^26 (遞減)
[CYCLE | NOCYCLE] -- 循環,預設 NOCYCLE
[CACHE n | NOCACHE]; -- 記憶體預取,預設 CACHE 20
| 參數 | 說明 | 預設值 |
|---|---|---|
INCREMENT BY | 正數遞增、負數遞減。不可為 0。 | 1 |
START WITH | 第一次 NEXTVAL 回傳值。 | 遞增:1, 遞減:MAXVALUE |
MAXVALUE/MINVALUE | 觸及邊界行為取決於 CYCLE。 | 見上 |
CYCLE | 達邊界後重新從另一端開始。 | NOCYCLE (報錯) |
CACHE | 預先在 SGA 分配號碼段,提升效能。資料庫異常關閉會導致間隙。 | 20 |
seq_name.NEXTVAL:取得下一值,序列遞增。seq_name.CURRVAL:取得當前 Session 最後一次 NEXTVAL 的值,不改變序列。SELECT myseq.NEXTVAL FROM DUAL; -- 1
SELECT myseq.NEXTVAL FROM DUAL; -- 2
SELECT myseq.CURRVAL FROM DUAL; -- 2 (不變)
CREATE TABLE member (
mid NUMBER PRIMARY KEY,
name VARCHAR2(50) NOT NULL
);
INSERT INTO member (mid, name) VALUES (myseq.NEXTVAL, '張三豐');
INSERT INTO member (mid, name) VALUES (myseq.NEXTVAL, '張翠山');
CREATE SEQUENCE myseq
START WITH 1 INCREMENT BY 2
MAXVALUE 10 MINVALUE 1
CYCLE CACHE 3;
ALTER SEQUENCE myseq
INCREMENT BY 5
MAXVALUE 1000
NOCYCLE
CACHE 50;
注意:START WITH 無法透過 ALTER 修改,需重建。
標準 SQL 方式,序列隱含於表定義中。
CREATE TABLE mytab (
mid NUMBER GENERATED BY DEFAULT AS IDENTITY
(START WITH 1 INCREMENT BY 1 NOCACHE),
name VARCHAR2(20) NOT NULL,
CONSTRAINT pk_mytab PRIMARY KEY (mid)
);
GENERATED BY DEFAULT:允許手動指定值覆蓋。GENERATED ALWAYS:強制由系統產生,手動插入報錯。SELECT sequence_name, min_value, max_value, increment_by, cycle_flag, cache_size, last_number
FROM user_sequences;