2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2

9.17.序列操作函式 #

本節介紹用於操作序列物件(也稱為序列生成器或簡稱序列)的函式。序列物件是使用 CREATE SEQUENCE 建立的特殊單行表。序列物件通常用於為表中的行生成唯一識別符號。序列函式(列於 表 9.55 中)提供簡單、多使用者安全的從序列物件獲取連續序列值的方法。

表 9.55. 序列函式

函式

描述

nextval ( regclass ) → bigint

將序列物件推進到下一個值並返回該值。這是原子操作:即使多個會話併發執行 nextval,每個會話也會安全地獲得一個不同的序列值。如果序列物件是使用預設引數建立的,則連續呼叫 nextval 將返回從 1 開始的連續值。透過在 CREATE SEQUENCE 命令中使用適當的引數可以獲得其他行為。

此函式需要序列的 USAGEUPDATE 許可權。

setval ( regclass, bigint [, boolean ] ) → bigint

設定序列物件的當前值,以及可選的 is_called 標誌。雙引數形式將序列的 last_value 欄位設定為指定值,並將其 is_called 欄位設定為 true,這意味著下一個 nextval 將在返回一個值之前推進序列。 currval 將報告的值也設定為指定值。在三引數形式中,is_called 可以設定為 truefalsetrue 的效果與雙引數形式相同。如果設定為 false,則下一個 nextval 將正好返回指定值,序列的推進從接下來的 nextval 開始。此外,在這種情況下, currval 報告的值不會改變。例如,

SELECT setval('myseq', 42);           Next nextval will return 43
SELECT setval('myseq', 42, true);     Same as above
SELECT setval('myseq', 42, false);    Next nextval will return 42

setval 返回的結果只是其第二個引數的值。

此函式需要序列的 UPDATE 許可權。

currval ( regclass ) → bigint

返回當前會話中此序列的 nextval 最近一次獲取的值。(如果在此會話中從未為該序列呼叫過 nextval,則會報告錯誤。)由於這會返回一個會話本地的值,因此無論其他會話自當前會話執行 nextval 以來是否執行了 nextval,它都會給出可預測的答案。

此函式需要序列的 USAGESELECT 許可權。

lastval () → bigint

返回當前會話中 nextval 最近一次返回的值。此函式與 currval 相同,但它不接受序列名稱作為引數,而是引用當前會話中最近應用 nextval 的序列。如果當前會話尚未呼叫 nextval,則呼叫 lastval 是錯誤的。

此函式需要最後使用的序列的 USAGESELECT 許可權。


注意

為了避免阻塞從同一序列獲取數字的併發事務,如果呼叫事務稍後中止, nextval 獲取的值不會被收回重用。這意味著事務中止或資料庫崩潰可能導致分配值序列中出現間隙。沒有事務中止也可能發生這種情況。例如,帶有 ON CONFLICT 子句的 INSERT 將在檢測到任何導致其遵循 ON CONFLICT 規則的衝突之前,計算要插入的元組,包括執行任何必需的 nextval 呼叫。因此, PostgreSQL 序列物件不能用於獲取無間隙序列

同樣, setval 對序列狀態所做的更改會立即對其他事務可見,並且如果呼叫事務回滾,則不會撤銷。

如果在提交包含 nextvalsetval 呼叫的事務之前資料庫叢集崩潰,則序列狀態更改可能尚未寫入持久儲存,因此在叢集重啟後序列具有原始狀態還是更新狀態是不確定的。這對於在資料庫中使用序列是無害的,因為未提交事務的其他影響也同樣不可見。但是,如果您希望將序列值用於資料庫之外的持久目的,請確保在這樣做之前已提交 nextval 呼叫。

要由序列函式操作的序列由 regclass 引數指定,該引數只是 pg_class 系統目錄中序列的 OID。但是,您不必手動查詢 OID,因為 regclass 資料型別的輸入轉換器會為您完成這項工作。有關詳細資訊,請參閱 第 8.19 節

提交更正

如果您在文件中發現任何不正確之處、與您在使用特定功能時的實際體驗不符之處或需要進一步說明之處,請使用 此表單 報告文件問題。