?
This document uses PHP Chinese website manual Release
本節(jié)描述PostgreSQL用于操作序列對(duì)象的函數(shù)。序列對(duì)象(也叫序列生成器或者就叫序列) 都是用 CREATE SEQUENCECREATE SEQUENCE創(chuàng)建的特殊的單行表。 一個(gè)序列對(duì)象通常用于為行或者表生成唯一的標(biāo)識(shí)符。在Table 9-39中列出的序列函數(shù)為我們 從序列對(duì)象中獲取后續(xù)的序列值提供了簡(jiǎn)單的、多用戶安全的方法。
Table 9-39. 序列函數(shù)
函數(shù) | 返回類型 | 描述 |
---|---|---|
currval(regclass) |
bigint | 返回最近一次用nextval 獲取的指定序列的數(shù)值 |
lastval() |
bigint | 返回最近一次用nextval 獲取任何序列的數(shù)值 |
nextval(regclass) |
bigint | 遞增序列并返回新值 |
setval(regclass,bigint) |
bigint | S設(shè)置序列的當(dāng)前數(shù)值 |
setval(regclass,bigint,boolean) |
bigint | 設(shè)置序列的當(dāng)前數(shù)值以及is_called標(biāo)志 |
用regclass參數(shù)指定序列函數(shù)操作的序列,它只是序列在 系統(tǒng)表空間的pg_class表里的 OID 。不過(guò),你不需要手工查找 OID ,因?yàn)?regclass數(shù)據(jù)類型的輸入轉(zhuǎn)換器會(huì)幫你做這件事。只要寫出單引號(hào)包圍的序列名字 即可,因此它看上去像文本常量。要達(dá)到和處理普通SQL名字的兼容性, 這個(gè)字符串將轉(zhuǎn)換成小寫,除非在序列名字周圍包含雙引號(hào),因此:
nextval('foo') operates on sequencefoo nextval('FOO') operates on sequencefoo nextval('"Foo"') operates on sequenceFoo
必要時(shí)序列名可以用模式修飾:
nextval('myschema.foo')operates on 操作myschema.foo nextval('"myschema".foo')same as above同上 nextval('foo') searches search path for 在搜索路徑中查foo
見(jiàn)Section 8.16獲取有關(guān)regclass的更多信息。
Note: 在PostgreSQL8.1之前,序列函數(shù)的參數(shù)類型是text而不是regclass, 而上面描述的從文本字符串到 OID 值的轉(zhuǎn)換將在每次調(diào)用的時(shí)候發(fā)生。 為了向下兼容,這個(gè)機(jī)制仍然存在, 但是在內(nèi)部實(shí)際上是在函數(shù)調(diào)用前隱含地將text轉(zhuǎn)換成regclass實(shí)現(xiàn)的
如果你把一個(gè)序列函數(shù)的參數(shù)寫成一個(gè)無(wú)修飾的文本字符串,那么它將變成類型 為regclass的常量。因?yàn)檫@只是一個(gè) OID ,它將跟蹤最初標(biāo)識(shí)的序列, 而不管后面是否改名、模式是否變化等等。這種"提前綁定"的行為通常是字段缺省 和視圖里面引用序列所需要的。但是有時(shí)候你可能想要"推遲綁定",這個(gè)時(shí)候序列的引用是在運(yùn)行時(shí)解析的。 要獲取推遲綁定的行為,我們可以強(qiáng)制存儲(chǔ)為text常量,而不是regclass常量:
nextval('foo'::text) foois looked up at runtime在運(yùn)行時(shí)查找請(qǐng)注意,推遲綁定是PostgreSQL版本 8.1 之前唯一可用的行為, 因此你可能需要在舊的應(yīng)用程序里如此使用來(lái)保留舊有的語(yǔ)義。
當(dāng)然,序列函數(shù)的參數(shù)也可以是表達(dá)式。如果它是一個(gè)文本表達(dá)式, 那么隱含的轉(zhuǎn)換將導(dǎo)致運(yùn)行時(shí)的查找。
可用的序列函數(shù)有:
nextval
遞增序列對(duì)象到它的下一個(gè)數(shù)值并且返回該值。這個(gè)動(dòng)作是自動(dòng)完成的:
即使多個(gè)會(huì)話并發(fā)運(yùn)行nextval
,
每個(gè)進(jìn)程也會(huì)安全地收到一個(gè)唯一的序列值。
currval
在當(dāng)前會(huì)話中獲取最近一次nextval
序列的數(shù)值。(如果在本會(huì)話中從未在
該序列上調(diào)用過(guò)nextval
,那么會(huì)報(bào)告一個(gè)錯(cuò)誤。)請(qǐng)注意,因?yàn)榇撕瘮?shù)返回一個(gè)本會(huì)話范圍的數(shù)值,
它也能給出一個(gè)可預(yù)計(jì)的結(jié)果,可以判斷其它會(huì)話是否執(zhí)行過(guò)nextval
函數(shù)
lastval
返回當(dāng)前會(huì)話里最近一次nextval
返回的數(shù)值。這個(gè)函數(shù)等效于currval
,
只是它不用序列名作為參數(shù),它獲取當(dāng)前會(huì)話里面最近一次nextval
使用的序列。
如果當(dāng)前會(huì)話還沒(méi)有調(diào)用過(guò)nextval
,那么調(diào)用lastval
是會(huì)報(bào)錯(cuò)的。
setval
重置序列對(duì)象的計(jì)數(shù)器數(shù)值。2個(gè)參數(shù)的形式設(shè)置序列的last_value字段
為聲明數(shù)值并且將其is_called字段設(shè)置為true,
表示下一次nextval
將在返回?cái)?shù)值之前遞增該序列。currval
報(bào)告的值也設(shè)定為指定的值。
在3個(gè)參數(shù)形式里,is_called可以設(shè)置為
true或false。如果你把它設(shè)置為false,
那么下一次nextval
將返回這里聲明的數(shù)值而隨后nextval
才開(kāi)始遞增該序列。
因此在這種情況下currval
報(bào)告的值沒(méi)有改變(這是8.3之前版本的一個(gè)變化) 比如,
SELECT setval('foo', 42);nextval
的下一個(gè)將返回43 SELECT setval('foo', 42, true);如上所述 SELECT setval('foo', 42, false);nextval
的下一個(gè)將返回42
setval
返回的結(jié)果就是它的第二個(gè)參數(shù)的數(shù)值。
如果一個(gè)序列對(duì)象是帶著默認(rèn)參數(shù)創(chuàng)建的,那么對(duì)它調(diào)用nextval
將返回從1開(kāi)始的后續(xù)數(shù)值。其它的行為可以通過(guò)使
用CREATE SEQUENCE的指定參數(shù)選項(xiàng)獲取;參閱其命令參考頁(yè)獲取更多信息。
Important: 為了避免從同一個(gè)序列獲取數(shù)值的當(dāng)前事務(wù)被阻塞,
nextval
操作決不會(huì)回滾; 也就是說(shuō),一旦一個(gè)數(shù)值已經(jīng)被抓走,那么就認(rèn)為它已經(jīng)用過(guò)了, 即使調(diào)用nextval
的事務(wù)后面又退出了也一樣。 這就意味著退出的事務(wù)可能在序列賦予的數(shù)值中留下"空洞"。setval
操作也決不回滾