?
本文檔使用 PHP中文網(wǎng)手冊 發(fā)布
CREATE [ TEMPORARY | TEMP ] SEQUENCE name [ INCREMENT [ BY ] increment ] [ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ] [ START [ WITH ] start ] [ CACHE cache ] [ [ NO ] CYCLE ] [ OWNED BY { table.column | NONE } ]
CREATE SEQUENCE將向當(dāng)前數(shù)據(jù)庫里增加一個新的序列號生成器。 包括創(chuàng)建和初始化一個新的名為name 的單行表。生成器將被使用此命令的用戶所有。
如果給出了一個模式名,那么該序列就在給定的模式中創(chuàng)建的。否則它會在當(dāng)前模式中創(chuàng)建。 臨時(shí)序列存在于一個特殊的模式中,因此創(chuàng)建臨時(shí)序列的時(shí)候不能給出模式名。序列名必需 和同一模式中的其它序列、表、索引、視圖的名字不同。
在創(chuàng)建序列后,你可以使用nextval
,currval
,
setval
函數(shù)操作序列。這些函數(shù)在Section 9.15
中有詳細(xì)文檔。
盡管你不能直接更新一個序列,但你可以使用:
SELECT * FROM name;
檢查一個序列的參數(shù)和當(dāng)前狀態(tài)。特別是序列的last_value字段顯示了任意后端
進(jìn)程最后分配的數(shù)值。當(dāng)然,如果其它進(jìn)程正積極地使用nextval
,這些值在被
打印出來的時(shí)候可能就已經(jīng)過時(shí)了。
如果聲明了這個修飾詞,那么該序列對象只為這個會話創(chuàng)建,并且在會話結(jié)束的時(shí)候自動刪除。 臨時(shí)序列存在的時(shí)候,除非用模式修飾的名字引用,否則同名永久序列是不可見的(在同一會話里)。
將要創(chuàng)建的序列名(可以用模式修飾)。
可選子句INCREMENT BY increment指定序列的步長。一個正數(shù)將 生成一個遞增的序列,一個負(fù)數(shù)將生成一個遞減的序列。缺省值是1。
可選的子句MINVALUE minvalue指定序列的最小值。如果沒有 聲明這個子句或者聲明了NO MINVALUE,那么遞增序列的缺省為1, 遞減序列的缺省為-263-1。
可選的子句MAXVALUE maxvalue指定序列的最大值。如果沒有 聲明這個子句或者聲明了NO MAXVALUE,那么遞增序列的缺省為2 63-1 and -1,遞減序列的缺省為-1。
可選的子句START WITH start 指定序列的起點(diǎn)。缺省初始值 對于遞增序列為minvalue,對于 遞減序列為maxvalue。
可選的子句CACHE cache為快速訪問而在內(nèi)存里預(yù) 先存儲多少個序列號。最小值(也是缺省值)是1,表示一次只能生成一個值, 也就是說沒有緩存。
CYCLE選項(xiàng)可用于使序列到達(dá)maxvalue或minvalue時(shí)可循環(huán)并繼續(xù)下去。也就是如果 達(dá)到極限,生成的下一個數(shù)據(jù)將分別是minvalue或maxvalue。
如果聲明了NO CYCLE,那么在序列達(dá)到其最大值之后任何對
nextval
的調(diào)用都強(qiáng)返回一個錯誤。如果既沒有聲明
CYCLE也沒有聲明NO CYCLE,那么
NO CYCLE是缺省。
OWNED BY選項(xiàng)將序列關(guān)聯(lián)到一個特定的表字段上。這樣, 在刪除那個字段或其所在表的時(shí)候?qū)⒆詣觿h除綁定的序列。指定的表和序列必須 被同一個用戶所擁有,并且在在同一個模式中。默認(rèn)的OWNED BY NONE 表示不存在這樣的關(guān)聯(lián)。
使用DROP SEQUENCE刪除一個序列。
序列是基于bigint運(yùn)算的,因此其范圍不能超過八字節(jié)的整數(shù)范圍(-9223372036854775808到9223372036854775807)。 在一些古老的平臺上可能沒有對八字節(jié)整數(shù)的編譯器支持,這種情況下序列使用普通的integer運(yùn)算范圍(-2147483648到+2147483647)。
如果cache大于一,并且這個序列對象將被用于多會話并發(fā)的場合,那么可能會有不可預(yù)料的結(jié)果發(fā)生。每個會話在每次訪問序列對象的過程中都將分配并緩存隨后的序列值,
并且相應(yīng)增加序列對象的last_value。這樣,同一個事務(wù)中的隨后的cache-1次nextval
將只是返回預(yù)先分配的數(shù)值,而不是使用動序列對象。因此,任何在會話中分配了卻沒有使用的數(shù)字都將在會話結(jié)束時(shí)丟失,從而導(dǎo)致序列里面出現(xiàn)"空洞"。
另外,盡管系統(tǒng)保證為多個會話分配獨(dú)立的序列值,但是如果考慮所有會話,那么這個數(shù)值可能會丟失順序。
比如,如果cache為10,那么會話A保留了1..10并且返回nextval
=1,然后會話B可能會保留11..20然后在會話 A 生成nextval=2之前返回nextval
=11。
因此,對于cache等于一的情況,可以安全地假設(shè)nextval
值是順序生成的;而如果把cache設(shè)置為大于一,那么你只能假設(shè)nextval
值總是保持唯一,卻不按順序生成。
同樣,last_value 將反映任何會話保留的最后數(shù)值,不管它是否曾被nextval
返回。
另外一個考慮是在這樣的序列上執(zhí)行的setval
將不會被其它會話注意到,直到它們用光他們自己緩存的數(shù)值。
創(chuàng)建一個叫serial的遞增序列,從101開始:
CREATE SEQUENCE serial START 101;
從此序列中選出下一個數(shù)字:
SELECT nextval('serial'); nextval --------- 101
從該序列中選擇下一個數(shù);
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,只有下面的例外:
還不支持標(biāo)準(zhǔn)的AS <數(shù)據(jù)類型>表達(dá)式。
使用nextval()
函數(shù)而不是標(biāo)準(zhǔn)的NEXT VALUE FOR
表達(dá)式獲取下一個數(shù)值。
OWNED BY子句是PostgreSQL的擴(kuò)展