9.11. 序列操作函數

本節描述 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 命令裡的 特殊參數獲取;參閱其命令參考頁獲取更多信息.