全部產品
Search
文件中心

PolarDB:CREATE SEQUENCE

更新時間:Jul 06, 2024

定義新序列產生器。

文法

CREATE SEQUENCE name [ INCREMENT BY increment ]
  [ { NOMINVALUE | MINVALUE minvalue } ]
  [ { NOMAXVALUE | MAXVALUE maxvalue } ]
  [ START WITH start ] [ CACHE cache | NOCACHE ] [ CYCLE ]

說明

CREATE SEQUENCE 可建立新的序號產生器。這涉及到建立並初始化一個新的特殊的單行表,其名稱為 name。產生器將由發布命令的使用者擁有。

如果給定 schema 名稱,則在指定的 schema 中建立序列,否則將在當前 schema 中建立序列。序列名稱必須與同一 schema 中其他任何序列、表、索引或視圖的名稱有所區別。

建立序列之後,可使用 NEXTVAL 和 CURRVAL 對序列進行操作。

參數

參數說明
name要建立的序列的名稱(可能是 schema 限定的)。
increment可選子句 INCREMENT BY increment 指定要添加到當前序列值以建立一個新值的值。正值將產生升序序列,負值將產生降序序列。預設值為 1。
NOMINVALUE | MINVALUE minvalue可選子句 MINVALUE minvalue 確定序列可產生的最小值。如果未提供此子句,則將使用預設值。升序序列和降序序列的預設值分別為 1 和 -263-1。請注意,可使用關鍵字 NOMINVALUE 將此行為設定為預設。
NOMAXVALUE | MAXVALUE maxvalue可選子句 MAXVALUE maxvalue 確定序列的最大值。如果未提供此子句,則將使用預設值。升序序列和降序序列的預設值分別為 263-1 和 -1。請注意,可使用關鍵字 NOMAXVALUE 將此行為設定為預設。
start可選子句 START WITH start 允許序列從任意位置開始。升序序列的預設起始值為 minvalue,降序序列的預設起始值為 maxvalue。
cache可選子句 CACHE cache 指定要預先分配多少序號並儲存在記憶體中以便更快地訪問。最小值為 1(一次只能產生一個值,如 NOCACHE),並且此值也是預設值。
CYCLECYCLE 選項允許當升序序列或降序序列分別達到 maxvalue 或 minvalue 時,序列迴繞。如果達到限制值,則產生的下一個數字將分別為 minvalue 或 maxvalue。

如果省略 CYCLE(預設值),則在序列達到其最大值後,對 NEXTVAL 的任何調用將返回錯誤。請注意,可以使用關鍵字 NO CYCLE 來獲得預設行為,但是此關鍵字與 Oracle 不相容。

注釋

序列基於大整數運算,因此範圍不能超過八位元組整數的範圍(-9223372036854775808 到 9223372036854775807)。在某些較早的平台上,編譯器可能不支援八位元組整數,在此情況下序列採用常規 INTEGER 運算(範圍從 -2147483648 到 +2147483647)。

如果由多個會話同時使用的序列對象採用大於 1 的 cache 設定,則可能會獲得意外的結果。每個會話在每次訪問序列對象期間都將分配並緩衝連續的序列值,從而增大了序列對象最後的值。隨後,接下來該會話中 cache-1 次使用 NEXTVAL 只是返回預分配的值,而不觸及序列對象。因此,當會話結束時,會話中已指派但並未使用的任何數值都將丟失,從而導致序列中出現若干“洞”。

此外,儘管可以保證為多個會話分配不同的序列值,但是當考慮所有會話時,可以不按順序產生這些值。例如,當 cache 設定為 10 時,會話 A 可能會保留值 1..10 並返回 NEXTVAL=1,然後會話 B 可能會保留值 11..20 並返回 NEXTVAL=11,但之後會話 A 產生了 NEXTVAL=2。因此,當 cache 設定為 1 時,可以安全地假設 NEXTVAL 值是按順序產生的。當 cache 設定大於 1 時,應當只假定 NEXTVAL 值全都是不同的,而不是純粹按順序產生的。此外,最後一個值體現的是任何會話保留的最新值,無論它是否已由 NEXTVAL 返回。

樣本

建立名為 serial 的升序序列,從 101 開始:

CREATE SEQUENCE serial START WITH 101;

從該序列中選擇下一個數:

SELECT serial.NEXTVAL FROM DUAL;

 nextval
---------
     101
(1 row)

採用 NOCACHE 選項,建立名為 supplier_seq 的序列:

CREATE SEQUENCE supplier_seq
    MINVALUE 1
    START WITH 1
    INCREMENT BY 1
    NOCACHE;

從該序列中選擇下一個數:

SELECT supplier_seq.NEXTVAL FROM DUAL;

 nextval
---------
       1
(1 row)