CREATE SEQUENCE(7)

NAME
CREATE SEQUENCE - 建立一個新的序列發生器

SYNOPSIS

CREATE [ TEMPORARY | TEMP ] SEQUENCE name [ INCREMENT [ BY ] increment ]
    [ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ]
    [ START [ WITH ] start ] [ CACHE cache ] [ [ NO ] CYCLE ]

DESCRIPTION 描述

CREATE SEQUENCE 將向當前資料庫裡增加一個新的序列號生成器。 包括建立和初始化一個新的名為 name的單行表。生成器將為使用此命令的使用者所有。

 如果給出了一個模式名，那麼該序列是在指定模式中建立的。 否則它會在當前模式中建立臨時序列存在於一個特殊的模式中，因此如果建立一個臨時序列的時候， 不能給出模式名。 序列名必需和同一模式中的其他序列，表，索引，或者檢視不同。

 在序列建立後，你可以使用函式 nextval, currval, 和 setval 操作序列。這些函式在 ``Sequence-Manipulation Functions'' 中有詳細文件。

 儘管你不能直接更新一個序列，但你可以使用象

SELECT * FROM name;

 檢查一個序列的引數和當前狀態。特別是序列的 last_value 欄位顯示了任意後端程序分配的最後的數值。 （當然，這些值在被打印出來的時候可能已經過時了 --- 如果其它程序正積極地使用 nextval。）

PARAMETERS 引數

TEMPORARY or TEMP
     如果聲明瞭這個修飾詞，那麼該序列物件只為這個會話建立， 並且在會話結束的時候自動刪除。在臨時序列存在的時候， 同名永久序列是不可見的（在同一會話裡），除非它們是用模式修飾的名字引用的。

name
     將要建立的序列號名（可以用模式修飾）。

increment
    INCREMENT BY increment 子句是可選的。一個正數將生成一個遞增的序列， 一個負數將生成一個遞減的序列。預設值是一（1）。

minvalue

NO MINVALUE
     可選的子句 MINVALUE minvalue 決定一個序列可生成的最小值。 如果沒有宣告這個子句或者聲明瞭 NO MINVALUE，那麼就使用預設。 預設分別是遞增序列為 1 遞減為 -263-1。

maxvalue

NO MAXVALUE
     使用可選子句 MAXVALUE maxvalue 決定序列的最大值。 如果沒有宣告這個子句或者聲明瞭 NO MAXVALUE，那麼就使用預設。 預設的分別是遞增為 263-1，遞減為 -1。

start
     可選的 START WITH start 子句 使序列可以從任意位置開始。預設初始值是遞增序列為 minvalue 遞減序列為 maxvalue.

cache
    CACHE cache 選項使序列號預分配並且為快速訪問儲存在記憶體裡面。 最小值（也是預設值）是1（一次只能生成一個值, 也就是說沒有快取）這也是預設。

CYCLE

NO CYCLE
     可選的CYCLE關鍵字可用於使序列到達 最大值（maxvalue） 或 最小值（minvalue） 時可復位並繼續下去。如果達到極限，生成的下一個資料將分別是 最小值（minvalue） 或 最大值（maxvalue）。

     如果聲明瞭可選的關鍵字 NO CYCLE， 那麼在序列達到其最大值之後任何對 nextval 的呼叫都強返回一個錯誤。 如果既沒有宣告 CYCLE 也沒有宣告 NO CYCLE， 那麼 NO CYCLE 是預設。

NOTES 注意

 使用 DROP SEQUENCE 語句來刪除序列。

 序列是基於 bigint 運算的，因此其範圍不能超過八位元組的整數範圍（-9223372036854775808 到 9223372036854775807）。 在一些老一點的平臺上可能沒有對八位元組整數的編譯器支援， 這種情況下序列使用普通的 integer 運算（範圍是 -2147483648 到 +2147483647）。

 如果 cache 設定大於一， 並且這個序列物件將被用於併發多會話的場合，那麼可能會有不可預料的結果發生。 每個會話在一次訪問序列物件的過程中將分配並快取隨後的序列值，並且相應增加序列物件的 last_value。 這樣，同一個事務中的隨後的 cache-1 次 nextval 將只是返回預先分配的數值，而不用動序列物件。因此，任何在一個會話中分配但是沒有使用的數字都將在會話結尾丟失，導致序列裡面出現"空洞"。

 另外，儘管系統保證為多個會話分配獨立的序列值，但是如果考慮所有會話， 那麼這個數值可能會丟失順序。比如，如果 cache 設定為 10，那麼會話 A 保留了 1..10 並且返回 nextval=1， 然後會話 B 可能會保留 11..20 然後在會話 A 生成 nextval=2 之前返回 nextval=11。因此，對於 cache 設定為一的情況，我們可以安全地假設 nextval 值是順序生成的； 而如果把 cache 設定得大於一， 那麼你只能假設 nextval 值總是唯一得，而不是完全順序地生成。 同樣，last_value 將反映任何會話保留的最後的數值，不管它是否曾被 nextval 返回。

 另外一個考慮是在這樣的序列上執行的 setval 將不會被其它會話注意到，直到它們用光他們快取的數值。

EXAMPLES 例子

 建立一個叫 serial 的遞增序列，從101開始：

CREATE SEQUENCE serial START 101;

 從此序列中選出下一個數字：

SELECT nextval('serial');

 nextval
---------
     114

 在一個 INSERT 中使用此序列：

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

 在一個 COPY FROM 後更新序列：

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

COMPATIBILITY 相容性

CREATE SEQUENCE 是 PostgreSQL 語言擴充套件。 在 SQL 標準裡沒有 CREATE SEQUENCE 語句。

譯者
Postgresql 中文網站 何偉平 <laser@pgsqldb.org>

跋
本頁面中文版由中文 man 手冊頁計劃提供。
中文 man 手冊頁計劃：https://github.com/man-pages-zh/manpages-zh