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