首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle Sequence(序列)完整指南:建立、參數詳解、使用場景、快取機制與 ALTER 維護

     編輯:Oracle 資料庫基礎

建立序列語法

CREATE SEQUENCE emp_sequence
  INCREMENT BY 1      -- 每次遞增值(可負數,負數為遞減序列)
  START WITH 1        -- 起始值
  NOMAXVALUE          -- 無最大值(或指定 MAXVALUE 999999)
  NOCYCLE             -- 不循環(到達極值報錯),CYCLE 則循環
  CACHE 10;           -- 記憶體預先配置 10 個值,提升效能

參數詳細說明

參數預設值說明
INCREMENT BY1步長,正數遞增、負數遞減,不可為 0
START WITH1 (遞增) / -1 (遞減)第一個產生的值
MAXVALUE / NOMAXVALUENOMAXVALUE遞增序列上限,遞減序列上限固定為 -1
MINVALUE / NOMINVALUENOMINVALUE遞減序列下限,遞增序列下限固定為 1
CYCLE / NOCYCLENOCYCLE到達極值後是否循環,循環會重複產生值
CACHE n / NOCACHECACHE 20記憶體預取值數量,NOCACHE 逐次讀磁碟
ORDER / NOORDERNOORDERRAC 環境下是否保證跨實例全域有序,單實例無影響

兩個偽欄位

  • sequence_name.NEXTVAL:遞增並回傳新值(每次呼叫產生新號碼)
  • sequence_name.CURRVAL:回傳當前 Session 最後一次 NEXTVAL 的值(需先呼叫過 NEXTVAL,否則報 ORA-08002)

可使用位置

  • 不含子查詢、快照、View 的 SELECT 陳述式
  • INSERT 的 VALUES 子句或子查詢
  • UPDATE 的 SET 子句

實戰範例

-- 插入新員工,主鍵自動取號
INSERT INTO emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
VALUES (empseq.NEXTVAL, 'LEWIS', 'CLERK', 7902, SYSDATE, 1200, NULL, 20);

-- 查詢剛插入的序列值
SELECT empseq.CURRVAL FROM DUAL;

重要特性與陷阱

  1. 同一陳述式多次 NEXTVAL 值不同:INSERT ... VALUES (seq.NEXTVAL, seq.NEXTVAL) 會產生兩個不同號碼。
  2. CURRVAL 為 Session 級:Session A 的 CURRVAL 不影響 Session B。
  3. CACHE 導致跳號:資料庫異常關機(SHUTDOWN ABORT)或實例崩潰,記憶體中未使用的快取值遺失,造成序列不連續。嚴格要求連續(如發票號)請用 NOCACHE。
  4. ROLLBACK 不回滾序列:已取出的 NEXTVAL 不會因交易回滾而「退回」。

ALTER SEQUENCE 維護

ALTER SEQUENCE emp_sequence
  INCREMENT BY 10
  MAXVALUE 1000000
  CACHE 20;

不可修改 START WITH,需 DROP 後重建。修改 INCREMENT BY 為負數可將遞增序列改為遞減。

權限控制

  • 建立:需 CREATE SEQUENCE 或 CREATE ANY SEQUENCE
  • 修改/刪除:擁有者或具 ALTER ANY SEQUENCE / DROP ANY SEQUENCE
  • 使用:需 SELECT 權限於序列物件
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved