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

Oracle Sequence 深度解析:NEXTVAL/CURRVAL、CACHE 機制、ALTER 範例與觸發器自增實作

     編輯:Oracle 資料庫基礎

Sequence 核心行為

Sequence 產生唯一序列號,常用於主鍵生成。關鍵特性:

  • 首次 NEXTVAL 回傳初始值(START WITH)
  • 後續 NEXTVAL 自動增加 INCREMENT BY 值並回傳新值
  • CURRVAL 回傳當前值,必須在首次 NEXTVAL 後才可使用,否則報錯
  • 同一陳述式中多次呼叫 NEXTVAL,每次都會遞增,回傳值不同

CACHE 與 NOCACHE:效能與間隙權衡

初始化參數 SEQUENCE_CACHE_ENTRIES 控制可同時快取的 Sequence 數量。

ALTER SEQUENCE 修改規則

  • 擁有者或具備 ALTER ANY SEQUENCE 權限才能修改
  • 可修改除 START WITH 外的所有參數
  • 需變更起始值時,必須 DROP SEQUENCE 重建

ALTER 範例

ALTER SEQUENCE emp_sequence
  INCREMENT BY 10
  MAXVALUE 10000
  CYCLE          -- 達到最大值後循環
  NOCACHE;       -- 關閉快取防止間隙

觸發器實作自動遞增主鍵(11g 前通用做法)

建立 Sequence

CREATE SEQUENCE seq_id
  MINVALUE 1
  MAXVALUE 99999999
  START WITH 1
  INCREMENT BY 1
  NOCACHE
  ORDER;

建立 BEFORE INSERT 觸發器

CREATE OR REPLACE TRIGGER tri_test_id
BEFORE INSERT ON s_depart
FOR EACH ROW
DECLARE
  v_next_id NUMBER;
BEGIN
  IF :NEW.depart_id IS NULL OR :NEW.depart_id = 0 THEN
    SELECT seq_id.NEXTVAL INTO v_next_id FROM DUAL;
    :NEW.depart_id := v_next_id;
  END IF;
END tri_test_id;
/

關鍵點:

  • 僅在主鍵為 NULL 或 0 時自動填充,保留手動指定彈性
  • 使用 SELECT ... INTO 而非直接賦值,相容舊版本
  • 12c+ 可直接使用 GENERATED AS IDENTITY 簡化

常見問題排查

  • ORA-08002:尚未呼叫 NEXTVAL 即使用 CURRVAL
  • 間隙過大:檢查 CACHE 設定、是否頻繁異常關機、ROLLBACK 導致序列值消耗
  • 效能瓶頸:高併發下考慮增大 CACHE、使用 ORDER/NOORDER、或改用 Identity Column
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
模式運作方式優點缺點
CACHE n預先在記憶體配置 n 個序列值存取快,減少磁碟 I/O異常關機(SHUTDOWN ABORT)導致快取值遺失,產生間隙
NOCACHE每次從磁碟讀取/更新不會間隙,數值連續效能較低,高併發下可能成為瓶頸