| PostgreSQL 8.0.0 中文文件(轉譯自 PostgreSQL 中國 製作的簡體中文版本) | ||||
|---|---|---|---|---|
| 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 命令裡的 特殊參數獲取;參閱其命令參考頁獲取更多訊息。