| PostgreSQL 7.4 文檔 | ||||
|---|---|---|---|---|
| Prev | Fast Backward | Chapter 9. 函數和操作符 | Fast Forward | Next |
本節描述 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 抓到的該序列的 數值.(如果在本會話中從未在該序列上調用過 nextval, 那麼會報告一個錯誤.)請注意因為此函數返回一個會話範圍的數值, 因此即使其它會話同時在執行 nextval,那麼它也能 給出一個可預計的結果.
重置序列對象的計數器數值.雙參數的形式設置序列的 last_value 字段為聲明數值並且將其 is_called 字段設置為 true,表示下一次 nextval 將在返回數值之前遞增該序列.在三參數形式裡,is_called 可以設置為 true 或 false.如果你把它設置為 false,那麼下一次 nextval 將返回這裡聲明的數值,而從隨後的 nextval 才開始遞增該序列. 比如
SELECT setval('foo', 42); 下次nextval將返回 43
SELECT setval('foo', 42, true); 和上面一樣
SELECT setval('foo', 42, false); 下次nextval將返回 42setval 返回的結果就是它的第二個參數的數值.
Important: 為了避免從同一個序列獲取數值的當前事務被阻塞, nextval 操作決不會回滾;也就是說,一旦一個數值已經 被抓走,那麼就認為它已經用過了,即使調用 nextval 的事務後面又退出了也一樣.這就意味著退出的事務可能在序列賦予的數值 中留下"空洞".setval 操作也決不回滾.
如果一個序列對象是帶著缺省參數創建的,那麼對它調用 nextval 將返回從1 開始的後續的數值. 其它的行為可以通過使用 CREATE SEQUENCE 命令裡的 特殊參數獲取;參閱其命令參考頁獲取更多信息.