支援的版本: 最新 (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.53 中列出的序列函數提供了簡單、多使用者安全的方法,用於從序列物件獲取連續的序列值。

表 9.53. 序列函數

函數

描述

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,它都會給出可預測的答案。

此函數需要序列上的 USAGESELECT 權限。

lastval () → bigint

傳回目前工作階段中 nextval 最近傳回的值。此函數與 currval 相同,不同之處在於它不是將序列名稱作為引數,而是指目前工作階段中最近套用 nextval 的序列。如果在目前工作階段中尚未呼叫 nextval,則呼叫 lastval 會產生錯誤。

此函數需要上次使用的序列上的 USAGESELECT 權限。


注意

為了避免阻擋從同一個序列取得號碼的並行交易,如果呼叫交易稍後中止,由 nextval 取得的值不會被回收重用。這表示交易中止或資料庫崩潰可能會導致已分配值的序列中出現間隙。即使沒有交易中止,這種情況也可能發生。例如,包含 ON CONFLICT 子句的 INSERT 會先計算要插入的元組,包括執行任何需要的 nextval 呼叫,然後才偵測到任何會導致它遵循 ON CONFLICT 規則的衝突。因此,PostgreSQL 序列物件無法用於取得無間隙的序列

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

如果資料庫叢集在提交包含 nextvalsetval 呼叫的交易之前崩潰,序列狀態變更可能尚未傳送到永久儲存空間,因此不確定在叢集重新啟動後,序列將具有其原始狀態還是更新狀態。這對於在資料庫中使用序列是無害的,因為未提交交易的其他影響也不會可見。但是,如果您希望將序列值用於資料庫外部的持久目的,請確保在執行此操作之前已提交 nextval 呼叫。

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

提交更正

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