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