支援的版本:目前 (17) / 16 / 15 / 14 / 13
開發版本:devel
不支援的版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

CREATE SEQUENCE

CREATE SEQUENCE — 定義一個新的序列產生器

概要

CREATE [ { TEMPORARY | TEMP } | UNLOGGED ] SEQUENCE [ IF NOT EXISTS ] name
    [ AS data_type ]
    [ INCREMENT [ BY ] increment ]
    [ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ]
    [ START [ WITH ] start ] [ CACHE cache ] [ [ NO ] CYCLE ]
    [ OWNED BY { table_name.column_name | NONE } ]

描述

CREATE SEQUENCE 建立一個新的序列號碼產生器。 這涉及到建立和初始化一個新的特殊單列資料表,其名稱為 name。 產生器將由發出指令的使用者擁有。

如果給定了 schema 名稱,則序列會在指定的 schema 中建立。 否則,它會在目前的 schema 中建立。 暫時序列存在於特殊的 schema 中,因此建立暫時序列時不能給定 schema 名稱。 序列名稱必須與同一 schema 中的任何其他關聯(資料表、序列、索引、檢視、實體化檢視或外部資料表)的名稱不同。

建立序列後,您可以使用函式 nextvalcurrvalsetval 來操作序列。 這些函式記錄在第 9.17 節中。

雖然您不能直接更新序列,但您可以使用如下查詢:

SELECT * FROM name;

來檢查序列的參數和目前狀態。 特別是,序列的 last_value 欄位顯示了任何 session 分配的最後一個值。 (當然,如果其他 session 正在積極執行 nextval 呼叫,則此值在列印時可能已過時。)

參數

TEMPORARYTEMP

如果指定,序列物件僅為此 session 建立,並在 session 結束時自動捨棄。 具有相同名稱的現有永久序列在暫時序列存在時不可見(在此 session 中),除非它們以 schema 限定的名稱引用。

UNLOGGED

如果指定,序列將建立為未記錄序列。 對未記錄序列的變更不會寫入預寫式日誌。 它們不具備當機安全:未記錄的序列在當機或不乾淨的關機後會自動重設為其初始狀態。 未記錄的序列也不會複寫到備用伺服器。

與未記錄的資料表不同,未記錄的序列不會提供顯著的效能優勢。 此選項主要用於透過識別欄或序列欄與未記錄的資料表相關聯的序列。 在這些情況下,將序列進行 WAL 記錄和複寫,但不複寫其關聯的資料表通常沒有意義。

IF NOT EXISTS

如果已存在具有相同名稱的關聯,則不要引發錯誤。 在這種情況下會發出通知。 請注意,無法保證現有關聯與將被建立的序列相似 — 它甚至可能不是序列。

name

要建立的序列的名稱(可選擇 schema 限定)。

data_type

可選子句 AS data_type 指定序列的資料類型。 有效的類型為 smallintintegerbigintbigint 是預設值。 資料類型決定序列的預設最小值和最大值。

increment

可選子句 INCREMENT BY increment 指定將哪個值新增到目前的序列值以建立新值。 正值將產生一個遞增序列,負值將產生一個遞減序列。 預設值為 1。

minvalue
NO MINVALUE

可選子句 MINVALUE minvalue 決定序列可以產生的最小值。 如果未提供此子句或指定了 NO MINVALUE,則將使用預設值。 遞增序列的預設值為 1。 遞減序列的預設值是資料類型的最小值。

maxvalue
NO MAXVALUE

可選的 MAXVALUE maxvalue 子句決定了序列的最大值。如果沒有提供這個子句,或者指定了 NO MAXVALUE,則將使用預設值。遞增序列的預設值是資料類型的最大值。遞減序列的預設值是 -1。

start

可選的 START WITH start 子句允許序列從任何地方開始。遞增序列的預設起始值是 minvalue,遞減序列的預設起始值是 maxvalue

cache

可選的 CACHE cache 子句指定了預先分配並儲存在記憶體中,以加快存取速度的序列號碼數量。最小值為 1(一次只能產生一個值,即沒有快取),這也是預設值。

CYCLE
NO CYCLE

當遞增或遞減序列分別達到 maxvalueminvalue 時,CYCLE 選項允許序列循環。如果達到極限,則下一個產生的數字將分別是 minvaluemaxvalue

如果指定了 NO CYCLE,則在序列達到其最大值後,任何對 nextval 的呼叫都將返回錯誤。如果未指定 CYCLENO CYCLE,則 NO CYCLE 是預設值。

OWNED BY table_name.column_name
OWNED BY NONE

OWNED BY 選項使序列與特定的資料表欄位相關聯,這樣,如果該欄位(或其整個資料表)被刪除,則序列也會自動被刪除。指定的資料表必須與序列具有相同的擁有者,並且位於相同的結構描述中。OWNED BY NONE (預設值) 指定沒有這樣的關聯。

注意事項

使用 DROP SEQUENCE 移除一個序列。

序列基於 bigint 算術,因此範圍不能超過八位元組整數的範圍(-9223372036854775808 到 9223372036854775807)。

因為 nextvalsetval 呼叫永遠不會被回滾,如果需要序列號碼的無間隙分配,則不能使用序列物件。可以通過使用包含計數器的資料表的獨佔鎖定來構建無間隙分配;但是,此解決方案比序列物件昂貴得多,特別是如果許多交易需要同時進行序列號碼。

如果將大於 1 的 cache 設定用於將由多個會話同時使用的序列物件,則可能會獲得意外的結果。每個會話將在一次存取序列物件期間分配和快取連續的序列值,並相應地增加序列物件的 last_value。然後,在該會話中接下來的 cache-1 次 nextval 使用只是返回預先分配的值,而無需觸摸序列物件。因此,在會話結束時,任何已分配但未在會話中使用的數字都將丟失,從而導致序列中出現漏洞

此外,雖然保證多個會話分配不同的序列值,但當考慮所有會話時,這些值的產生可能不是按順序的。例如,在 cache 設定為 10 的情況下,會話 A 可能保留值 1..10 並返回 nextval=1,然後會話 B 可能保留值 11..20 並在會話 A 產生 nextval=2 之前返回 nextval=11。因此,在 cache 設定為 1 的情況下,可以安全地假設 nextval 值是按順序產生的;在 cache 設定大於 1 的情況下,您應該只假設 nextval 值都是不同的,而不是假設它們是純粹按順序產生的。此外,last_value 將反映任何會話保留的最新值,無論是否已由 nextval 返回。

另一個考慮因素是,在此類序列上執行的 setval 在其他會話用完他們快取的任何預先分配的值之前,不會被他們注意到。

範例

建立一個名為 serial 的遞增序列,從 101 開始

CREATE SEQUENCE serial START 101;

從此序列中選擇下一個數字

SELECT nextval('serial');

 nextval
---------
     101

從此序列中選擇下一個數字

SELECT nextval('serial');

 nextval
---------
     102

INSERT 命令中使用此序列

INSERT INTO distributors VALUES (nextval('serial'), 'nothing');

COPY FROM 後更新序列值

BEGIN;
COPY distributors FROM 'input_file';
SELECT setval('serial', max(id)) FROM distributors;
END;

相容性

CREATE SEQUENCE 符合SQL標準,但有以下例外

  • 獲取下一個值是使用 nextval() 函式完成的,而不是標準的 NEXT VALUE FOR 表達式。

  • OWNED BY 子句是一個 PostgreSQL 擴充。

提交更正

如果您在文件中發現任何不正確,與特定功能的經驗不符或需要進一步澄清的地方,請使用此表單來報告文件問題。