本節描述對sequence objects進行操作的函數,也稱為序列生成器或序列。 序列對象是使用CREATE SEQUENCE創建的特殊單行表。 序列對象通常用于為表中的行生成惟一標識符。在序列函數表中列出的序列函數,提供了簡單的、多用戶安全方法,用于從序列對象中獲取連續的序列值。
序列函數
將序列對象推進到下一個值并返回該值。這是自動完成的:即使多個會話并發地執行 這個函數需要 |
設置序列對象的當前值,以及可選的它的
這個函數在序列上需要 |
返回 這個函數需要序列上的 |
返回 該函數在最后使用的序列上需要 |
為了避免阻塞從相同序列中獲取數字的并發事務,nextval
操作永遠不會回滾;也就是說,一旦獲取了一個值,它就會被認為是已使用的,并且不會再次返回。 即使周圍的事務隨后中止,或者調用查詢最終沒有使用該值,也會出現這種情況。 例如,帶有ON CONFLICT
子句的INSERT
將計算要插入的元組,包括執行任何必需的nextval
調用,在檢測到任何可能導致它遵循ON CONFLICT
規則的沖突之前。 這種情況會在賦值序列中留下未使用的“holes”。因此,本數據庫序列對象不能被用于獲取 “gapless” 序列。
同樣的,如果事務回滾,setval
所做的任何序列狀態更改都不會撤消。
序列函數所要操作的序列由regclass
參數指定,該參數只是pg_class
系統目錄中序列的 OID。 你不必手工查找 OID,不過,因為regclass
數據類型的輸入轉換器將為您完成這項工作。 只需將序列名用單引號括起來,這樣它看起來就像一個文字常量。 為了與處理普通 SQL 名稱兼容,字符串將被轉換為小寫,除非它在序列名稱周圍包含雙引號。因此:
nextval('foo') 序列上操作 foo
nextval('FOO') 序列上操作 foo
nextval('"Foo"') 序列上操作 Foo
如需要,序列名稱可以是模式限定的:
nextval('myschema.foo') 操作 myschema.foo
nextval('"myschema".foo') 同上
nextval('foo') 在搜索路徑中查找 foo
在本數據庫 8.1 之前,序列函數的參數類型是text
, 而不是 regclass
,并且前文所述的從文本串到 OID 值的轉換將在每次調用的時候發生。 為了向后兼容,這個處理仍然存在,但是在內部實際上是通過在函數調用前隱式地將text
轉換成regclass
實現的。
當你把一個序列函數的參數寫成一個無修飾的文字串,那么它將變成類型為regclass
的常量。 因為這只是一個 OID,它將跟蹤最初標識的序列,而不管后面是否改名、模式變化等等。 這種“早期綁定”的行為通常是列默認值和視圖中引用的序列所需要的。 但是有時候你可能想要“延遲綁定”,其中序列的引用是在運行時解析的。 要得到延遲綁定的行為,我們可以強制常量被存儲為text
常量,而不是regclass
:
nextval('foo'::text) foo is looked up at runtime
請注意,延遲綁定是本數據庫版本 8.1 之前唯一被支持的行為, 因此你可能需要做這些來保留舊應用的語義。
當然,序列函數的參數也可以是表達式。如果它是一個文本表達式,那么隱式的轉換將導致運行時的查找。