日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

序列操作函數

本節描述對sequence objects進行操作的函數,也稱為序列生成器或序列。 序列對象是使用CREATE SEQUENCE創建的特殊單行表。 序列對象通常用于為表中的行生成惟一標識符。在序列函數表中列出的序列函數,提供了簡單的、多用戶安全方法,用于從序列對象中獲取連續的序列值。

序列函數

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報告的值在這種情況下不會改變。例如,

setval返回的結果就是它的第二個參數的值。

這個函數在序列上需要UPDATE特權。

currval ( regclass ) → bigint

返回nextval在當前會話中為該序列最近獲取的值。(如果在這個會話中沒有為這個序列調用nextval會報告錯誤) 因為它返回的是一個會話本地值,所以它給出了一個可預測的答案,即自當前會話以來,其他會話是否執行了nextval

這個函數需要序列上的USAGESELECT特權。

lastval () → bigint

返回nextval在當前會話中最近返回的值。這個函數與currval相同,不同之處在于它沒有使用序列名作為參數,而是引用當前會話中nextval最近應用到的序列。 如果在當前會話中還沒有調用nextval,那么調用lastval是一個錯誤。

該函數在最后使用的序列上需要USAGESELECT特權。

為了避免阻塞從相同序列中獲取數字的并發事務,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 之前唯一被支持的行為, 因此你可能需要做這些來保留舊應用的語義。

當然,序列函數的參數也可以是表達式。如果它是一個文本表達式,那么隱式的轉換將導致運行時的查找。