| PostgreSQL | ||
|---|---|---|
| 上一頁 | 下一頁 | |
CREATE SEQUENCE ─ 創建一個新的序列號產生器
CREATE SEQUENCE seqname [ INCREMENT increment ]
[ MINVALUE minvalue ] [ MAXVALUE maxvalue ]
[ START start ] [ CACHE cache ] [ CYCLE ]
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;
CREATE SEQUENCE 是 Postgres 語言擴展。在 SQL92 裡沒有 CREATE SEQUENCE 語句。
| 上一頁 | 首頁 | 下一頁 |
| CREATE RULE | 開頭 | CREATE TABLE |