本節介紹用於操作序列物件(也稱為序列生成器或簡稱序列)的函式。序列物件是使用 CREATE SEQUENCE 建立的特殊單行表。序列物件通常用於為表中的行生成唯一識別符號。序列函式(列於 表 9.55 中)提供簡單、多使用者安全的從序列物件獲取連續序列值的方法。
表 9.55. 序列函式
函式 描述 |
---|
將序列物件推進到下一個值並返回該值。這是原子操作:即使多個會話併發執行 此函式需要序列的 |
設定序列物件的當前值,以及可選的 SELECT setval('myseq', 42); Next
此函式需要序列的 |
返回當前會話中此序列的 此函式需要序列的 |
返回當前會話中 此函式需要最後使用的序列的 |
為了避免阻塞從同一序列獲取數字的併發事務,如果呼叫事務稍後中止, nextval
獲取的值不會被收回重用。這意味著事務中止或資料庫崩潰可能導致分配值序列中出現間隙。沒有事務中止也可能發生這種情況。例如,帶有 ON CONFLICT
子句的 INSERT
將在檢測到任何導致其遵循 ON CONFLICT
規則的衝突之前,計算要插入的元組,包括執行任何必需的 nextval
呼叫。因此, PostgreSQL 序列物件不能用於獲取“無間隙”序列。
同樣, setval
對序列狀態所做的更改會立即對其他事務可見,並且如果呼叫事務回滾,則不會撤銷。
如果在提交包含 nextval
或 setval
呼叫的事務之前資料庫叢集崩潰,則序列狀態更改可能尚未寫入持久儲存,因此在叢集重啟後序列具有原始狀態還是更新狀態是不確定的。這對於在資料庫中使用序列是無害的,因為未提交事務的其他影響也同樣不可見。但是,如果您希望將序列值用於資料庫之外的持久目的,請確保在這樣做之前已提交 nextval
呼叫。
要由序列函式操作的序列由 regclass
引數指定,該引數只是 pg_class
系統目錄中序列的 OID。但是,您不必手動查詢 OID,因為 regclass
資料型別的輸入轉換器會為您完成這項工作。有關詳細資訊,請參閱 第 8.19 節。
如果您在文件中發現任何不正確之處、與您在使用特定功能時的實際體驗不符之處或需要進一步說明之處,請使用 此表單 報告文件問題。