PostgreSQL
上一頁   下一頁

CREATE SEQUENCE

名稱

CREATE SEQUENCE ─ 創建一個新的序列號產生器

CREATE SEQUENCE seqname [ INCREMENT increment ]
    [ MINVALUE minvalue ] [ MAXVALUE maxvalue ]
    [ START start ] [ CACHE cache ] [ CYCLE ]
  

輸入

seqname
將要創建的序列號名。
increment
INCREMENT increment 子句是可選的。一個正數將產生一個遞增的序列,一個負數將產生一個遞減的序列。預設值是一(1)。
minvalue
可選的子句 MINVALUE minvalue 決定一個序列可產生的最小值。預設分別是遞增序列為1遞減為-2147483647。
maxvalue
使用可選子句 MAXVALUE maxvalue 決定序列的最大值。預設的分別是遞增為2147483647,遞減為-1。
start
可選的 START start 子句 使序列可以從任意位置開始。預設初始值是遞增序列為 minvalue 遞減序列為 maxvalue
cache
CACHE cache 選項使序列號預分配並且為快速訪問儲存在內存裡面。最小值(也是預設值)是1(一次只能產生一個值, 也就是說沒有緩存)。
CYCLE
可選的 CYCLE 關鍵字可用於使序列到達最大值(maxvalue)或最小值(minvalue)時可復位並繼續下去。如果達到極限,產生的下一個數據將分別是最小值(minvalue)或最大值(maxvalue)。

輸出

CREATE
命令成功執行的返回資訊。
ERROR: Relation 'seqname' already exists
如果聲明的序列已經存在。
ERROR: DefineSequence: MINVALUE (start) can't be >= MAXVALUE (max)
如果聲明的初始值超出範圍(最大值),返回此資訊。
ERROR: DefineSequence: START value (start) can't be < MINVALUE (min)
如果聲明的初始值超出範圍(最小值),返回此資訊。
ERROR: DefineSequence: MINVALUE (min) can't be >= MAXVALUE (max)
如果最小值和最大值不連貫。

描述

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

在序列創建後,你可以使用函數 nextval(seqname) 從序列中獲得新的數字。函數 currval('seqname') 可用於獲取對當前會話中指定序列的上一次 nextval(seqname) 調用返回的數字。函數 setval('seqname', newvalue) 可用於設置指定的序列的當前值。下一次 nextval(seqname) 調用將返回所給的值加上序列增值。

使用像

SELECT * FROM sequence_name;
   

這樣的查詢可以獲得序列的參數。除了獲取最初的參數外,你可以用

SELECT last_value FROM sequence_name;
   

獲得後端分配的最後一個值。parameters, you can use (譯注:?好像沒寫完)

底層的鎖定用於令多個請求同時調用產生器成為可能。

注意
如果用語序列對像的緩存的設置大於一,而且該對像可能被多個後端同時使用就有可能產生不可預料的結果。每個後端在訪問過序列對像並遞增序列對像的最後值後,將分配跟在序列值後面"緩存數"。這樣,該後端在下面的(緩存數-1)次返回序列值時將使用預分配好的數值,而不對共享對像做任何更新。所以,已經分配但在當前會話中沒有使用的數字將會丟失。而且,盡管多個後端保証分配獨立的序列值,當考慮所有的後端時該數值卻有可能是亂序的。(例如,設置緩存數為10,後端 A 可能保留數值 1..10 並且返回 nextval=1,而後端 B 可能保留數值 11..20 並在後端A產生nextval=2之前返回 nextval=11。)因此,將緩存數設為一可以安全地假設 nextval 的數值是順序產生的﹔當緩存數設置大於一,我們只能假設 nextval 值都是獨立的,而不能假設它們都是純粹順序產生的。同樣,last_value 將反映由任何後端保留的最後數值,不管它是不是nextval曾返回過的。

注意

請參考 DROP SEQUENCE 語句來刪除序列。

每個後端使用其自身的緩存來儲存分配的數字。已分配但當前會話沒有使用的數字將丟失,導致序列裡面出現"空洞"。

用法

創建一個叫 serial 的遞增序列,從101開始:

CREATE SEQUENCE serial START 101;
  

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

SELECT NEXTVAL ('serial');
    
nextval
-------
    114
   

在一個 INSERT 中使用此序列:

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

在一個 COPY FROM 後設置序列:

CREATE FUNCTION distributors_id_max() RETURNS INT4
    AS 'SELECT max(id) FROM distributors' 
    LANGUAGE 'sql';
BEGIN;
    COPY distributors FROM 'input_file';
    SELECT setval('serial', distributors_id_max());
END;
   

兼容性

SQL92

CREATE SEQUENCE 是 Postgres 語言擴展。在 SQL92 裡沒有 CREATE SEQUENCE 語句。


上一頁 首頁 下一頁
CREATE RULE 開頭 CREATE TABLE