本節描述用於操作序列物件的函數,也稱為序列產生器或簡稱為序列。序列物件是用 CREATE SEQUENCE 建立的特殊單列資料表。序列物件通常用於為資料表的列產生唯一識別碼。 表 9.53 中列出的序列函數提供了簡單、多使用者安全的方法,用於從序列物件獲取連續的序列值。
表 9.53. 序列函數
函數 描述 |
---|
將序列物件遞增到其下一個值並傳回該值。這是以原子方式完成的:即使多個工作階段同時執行 此函數需要序列上的 |
設定序列物件的目前值,並可選擇性地設定其 SELECT setval('myseq', 42); Next
此函數需要序列上的 |
傳回目前工作階段中 此函數需要序列上的 |
傳回目前工作階段中 此函數需要上次使用的序列上的 |
為了避免阻擋從同一個序列取得號碼的並行交易,如果呼叫交易稍後中止,由 nextval
取得的值不會被回收重用。這表示交易中止或資料庫崩潰可能會導致已分配值的序列中出現間隙。即使沒有交易中止,這種情況也可能發生。例如,包含 ON CONFLICT
子句的 INSERT
會先計算要插入的元組,包括執行任何需要的 nextval
呼叫,然後才偵測到任何會導致它遵循 ON CONFLICT
規則的衝突。因此,PostgreSQL 序列物件無法用於取得「無間隙」的序列。
同樣地,由 setval
所做的序列狀態變更會立即對其他交易可見,並且如果呼叫交易回滾,則不會撤銷。
如果資料庫叢集在提交包含 nextval
或 setval
呼叫的交易之前崩潰,序列狀態變更可能尚未傳送到永久儲存空間,因此不確定在叢集重新啟動後,序列將具有其原始狀態還是更新狀態。這對於在資料庫中使用序列是無害的,因為未提交交易的其他影響也不會可見。但是,如果您希望將序列值用於資料庫外部的持久目的,請確保在執行此操作之前已提交 nextval
呼叫。
要由序列函數操作的序列由 regclass
引數指定,它只是 pg_class
系統目錄中序列的 OID。但是,您不必手動查找 OID,因為 regclass
資料類型的輸入轉換器會為您完成這項工作。 有關詳細信息,請參見第 8.19 節。
如果您在文件中發現任何不正確、與您使用特定功能的經驗不符或需要進一步澄清之處,請使用此表單報告文件問題。