9.12. 序列操作函數

本節描述 PostgreSQL 用於操作 序列對像的函數。序列對像(也叫序列生成器或者就是序列) 都是用 CREATE SEQUENCE 建立的特殊的單行資料表。 一個序列對像通常用於為行或者資料表生成唯一的標識符。 序列函數,在 Table 9-34 列出, 為我們從序列對像中獲取後續的序列值提供了簡單的,多用戶安全的 方法。

Table 9-34. 序列函數

函數返回類型描述
nextval(text)bigint遞增序列並返回新值
currval(text)bigint返回最近一次用nextval獲取的數值
setval(text, bigint)bigint設置序列的目前數值
setval(text, bigint, boolean)bigint設置序列的目前數值以及 is_called 標誌

由於歷史原因,序列函數調用可以操作的序列是透過一個文本字串參數聲明的。 為了可以和處理普通SQL名字具有一定相容性,序列函數把它們的參數 轉換成小寫,除非用戶用雙引號把它們括起來。因此

nextval('foo')      操作序列號 foo
nextval('FOO')      操作序列號 foo
nextval('"Foo"')    操作序列號 Foo

必要時序列名可以用模式修飾︰

nextval('myschema.foo') myschema.foo 上操作
nextval('"myschema".foo') 同上
nextval('foo')      foo 搜索搜索路徑

當然,文本參數可以是一個資料表達式的參數,而不僅僅是一個簡單的文本, 這一點有時候是有用的。

可用的序列函數有︰

nextval

遞增序列對像到它的下一個數值並且返回該值。這個動作是自動完成的: 即使多個會話並發執行 nextval,每個進程也會安全地收到一個唯一的序列值。

currval

在目前會話中返回最近一次 nextval 抓到的該序列的數值。 (如果在本會話中從未在該序列上調用過 nextval, 那麼會報告一個錯誤。)請注意因為此函數返回一個會話範圍的數值, 它也能給出一個可預計的結果,可以判斷其它會話是否執行過 nextval

setval

重置序列對象的計數器數值。雙參數的形式設置序列的 last_value 字串為聲明數值並且將其 is_called 字串設置為 true,資料表示下一次 nextval 將在返回數值之前遞增該序列。在三參數形式裡,is_called 可以設置為 truefalse。如果您把它設置為 false,那麼下一次 nextval 將返回這裡聲明的數值,而從隨後的 nextval 才開始遞增該序列。 比如

SELECT setval('foo', 42);	   下次nextval將返回 43
SELECT setval('foo', 42, true);     和上面一樣
SELECT setval('foo', 42, false);    下次nextval將返回 42

setval 返回的結果就是它的第二個參數的數值。

Important: 為了避免從同一個序列獲取數值的目前交易被阻塞, nextval 操作決不會回滾;也就是說,一旦一個數值已經被抓走, 那麼就認為它已經用過了,即使調用 nextval 的交易後面又退出了也一樣。這就意味著退出的交易可能在序列賦予的數值中留下"空洞"setval 操作也決不回滾。

如果一個序列對象是帶著預設參數建立的,那麼對它調用 nextval 將返回從1 開始的後續的數值。 其它的行為可以透過使用 CREATE SEQUENCE 命令裡的 特殊參數獲取;參閱其命令參考頁獲取更多訊息。