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

Oracle Sequence 完整指南:建立、參數詳解、觸發器實現自增主鍵

     編輯:Oracle 資料庫基礎

前置知識:SQL*Plus 多行執行

SQL*Plus 執行 PL/SQL 區塊或多行指令,**必須以單獨一行 / 結束**並送出執行。

一、 CREATE SEQUENCE 語法與參數全解

CREATE SEQUENCE seq_name
  [INCREMENT BY n]       -- 步長,預設 1;負值為遞減
  [START WITH n]         -- 起始值,預設 1
  [MAXVALUE n | NOMAXVALUE]  -- 最大值,預設 NOMAXVALUE (遞增上限 10^27)
  [MINVALUE n | NOMINVALUE]  -- 最小值,預設 NOMINVALUE (遞減下限 -10^26)
  [CYCLE | NOCYCLE]      -- 循環/不循環,預設 NOCYCLE
  [CACHE n | NOCACHE];   -- 記憶體預取,預設 CACHE 20

參數行為細節

  • CACHE:預載號碼至 SGA,提升效能;實例重啟或 Crash 會導致間隙。NOCACHE 無間隙但效能較差。
  • CYCLE:達極值後回轉;NOCYCLE 達極值報錯 ORA-08004。
  • INCREMENT BY:負值時 START WITH 應大於 MINVALUE。

二、 刪除 Sequence

DROP SEQUENCE seq_name;

三、 實戰:Sequence + Trigger 實現自增主鍵

場景:表 TEST,主鍵 TEST_ID

-- 1. 建立 Sequence
CREATE SEQUENCE seq_test
  INCREMENT BY 1
  START WITH 1
  MINVALUE 1
  NOMAXVALUE
  NOCYCLE
  CACHE 20;

-- 2. 建立 BEFORE INSERT Trigger
CREATE OR REPLACE TRIGGER trg_test
BEFORE INSERT ON test
FOR EACH ROW
BEGIN
  SELECT seq_test.NEXTVAL INTO :NEW.test_id FROM dual;
END;
/

替代方案:SQL 直接呼叫

INSERT INTO test (test_id, col1) VALUES (seq_test.NEXTVAL, 'value');

優點:簡單、無 Trigger 開銷;缺點:應用程式需知 Sequence 名稱,耦合度較高。

四、 進階技巧

1. 取得當前值 / 下一值

SELECT seq_test.CURRVAL FROM dual;  -- 當前 Session 最後取得的值
SELECT seq_test.NEXTVAL FROM dual;  -- 取得下一值並前進

CURRVAL 必須在同 Session 先呼叫過 NEXTVAL,否則報 ORA-08002。

2. 重設 Sequence(不支援 ALTER SEQUENCE RESET)

-- 方法:取得下一值並計算差值,負增量調整
SELECT seq_test.NEXTVAL FROM dual;  -- 假設回傳 1001
ALTER SEQUENCE seq_test INCREMENT BY -1000;
SELECT seq_test.NEXTVAL FROM dual;  -- 回傳 1
ALTER SEQUENCE seq_test INCREMENT BY 1;

3. 監控 Sequence 狀態

SELECT sequence_name, last_number, cache_size, increment_by
FROM user_sequences
WHERE sequence_name = 'SEQ_TEST';
  • LAST_NUMBER:已快取的下一個可用號碼(含快取區間)。
  • 實際已發出號碼 ≤ LAST_NUMBER。

五、 12c+ 新特性:IDENTITY COLUMN

CREATE TABLE test (
  test_id NUMBER GENERATED ALWAYS AS IDENTITY,
  col1 VARCHAR2(100)
);
  • 內建 Sequence,語法標準化,無需 Trigger。
  • 支援 GENERATED BY DEFAULT ON NULL 允許手工指定值。
  • **首選方案**,簡化架構、提升可維護性。

結語

Sequence 是 Oracle 產生唯一序號的核心機制。掌握 CACHE/CYCLE/INCREMENT 行為、善用 TRIGGER 或 12c IDENTITY 實現自增主鍵,並理解 LAST_NUMBER 與實際發號的關係,是資料模型設計的基本功。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved