Postgresql

如何獲取有關 Postgres 10 中新身份列背後的序列的資訊?(生成{始終|預設}作為身份)

  • December 30, 2017

Postgres 10 帶來了 SQL 標準GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY特性的實現,鬆散地稱為標識列。這個特性取代了 Postgres 自己的SERIAL偽類型,消除了它的問題/問題。有關詳細資訊,請參閱此處此處

GENERATED…優於的主要原因之一SERIAL是序列號生成器在後台透明處理。我們可以添加列、調整目前序列號和刪除列,所有這些都無需顯式引用序列。

CREATE TABLE tbl (
   col  BIGINT 
        GENERATED ALWAYS AS IDENTITY 
        PRIMARY KEY ,
   col2 text
) 
;

和…

ALTER TABLE tbl
ALTER COLUMN col
RESTART WITH 1000
;

和…

ALTER TABLE tbl
ALTER COLUMN col
DROP IDENTITY IF EXISTS
;

要麼…

ALTER TABLE tbl
ALTER COLUMN col
DROP COLUMN IF EXISTS
;

請注意,在這些範常式式碼中,我們都沒有引用特定的序列生成對象。

我假設這個特性是使用Postgres中現有的序列特性實現的。

➠ 我們如何查詢這個背景序列?我們如何詢問生成的最後一個/下一個值是什麼?序列操作函式的等價物是什麼?

您似乎使用與以前相同的功能:

https://www.postgresql.org/docs/10/static/functions-info.html

pg_get_serial_sequence 返回與列關聯的序列的名稱,如果沒有序列與列關聯,則返回 NULL。 如果該列是標識列,則關聯的序列是內部為標識列創建的序列. 對於使用其中一種序列類型(serial、smallserial、bigserial)創建的列,它是為該序列列定義創建的序列。在後一種情況下,可以使用 ALTER SEQUENCE OWNED BY 修改或刪除此關聯。(該函式可能應該被稱為 pg_get_owned_sequence;它的目前名稱反映了它通常用於串列或大串列列的事實。)第一個輸入參數是具有可選模式的表名,第二個參數是列名。因為第一個參數可能是模式和表,所以它不被視為雙引號標識符,這意味著預設情況下它是小寫的,而第二個參數只是一個列名,被視為雙引號並具有它的案例保存。典型用途是讀取標識或序列列的序列的目前值,例如

SELECT currval(pg_get_serial_sequence(‘sometable’, ‘id’));

引用自:https://dba.stackexchange.com/questions/187708