CREATE SEQUENCE(7) | SQL Commands | CREATE SEQUENCE(7) |
CREATE SEQUENCE - 建立一個新的序列發生器
CREATE [ TEMPORARY | TEMP ] SEQUENCE name [ INCREMENT [ BY ] increment ] [ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ] [ START [ WITH ] start ] [ CACHE cache ] [ [ NO ] CYCLE ]
CREATE SEQUENCE 將向當前資料庫裡增加一個新的序列號生成器。 包括建立和初始化一個新的名為 name的單行表。生成器將為使用此命令的使用者所有。
如果給出了一個模式名,那麼該序列是在指定模式中建立的。
否則它會在當前模式中建立臨時序列存在於一個特殊的模式中,因此如果建立一個臨時序列的時候,
不能給出模式名。
序列名必需和同一模式中的其他序列,表,索引,或者檢視不同。
在序列建立後,你可以使用函式
nextval, currval, 和 setval
操作序列。這些函式在
``Sequence-Manipulation Functions''
中有詳細文件。
儘管你不能直接更新一個序列,但你可以使用象
SELECT * FROM name;
如果聲明瞭可選的關鍵字
NO CYCLE,
那麼在序列達到其最大值之後任何對
nextval
的呼叫都強返回一個錯誤。
如果既沒有宣告 CYCLE
也沒有宣告 NO CYCLE,
那麼 NO CYCLE 是預設。
使用 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
將不會被其它會話注意到,直到它們用光他們快取的數值。
建立一個叫 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;
CREATE SEQUENCE 是 PostgreSQL 語言擴充套件。 在 SQL 標準裡沒有 CREATE SEQUENCE 語句。
Postgresql 中文網站 何偉平 <laser@pgsqldb.org>
本頁面中文版由中文
man 手冊頁計劃提供。
中文 man
手冊頁計劃:https://github.com/man-pages-zh/manpages-zh
2003-11-02 | SQL - Language Statements |