Postgresql

如何獲取序列列的序列名稱

  • March 31, 2017

據我所知,此查詢應顯示串列列的新值的表達式:

select d.adsrc
from (
SELECT a.attrelid, a.attnum, n.nspname, c.relname, a.attname
FROM pg_catalog.pg_attribute a, pg_namespace n, pg_class c
WHERE a.attnum > 0
AND NOT a.attisdropped
AND a.attrelid = c.oid
and c.relkind not in ('S','v')
and c.relnamespace = n.oid
and n.nspname not in ('pg_catalog','pg_toast','information_schema')
) x
left join pg_attrdef d on d.adrelid = x.attrelid and d.adnum = x.attnum
where x.relname = 'table_name' and x.nspname = 'schema_name' and x.attname = 'column_name'
;

它大部分時間都有效,但如果我重命名序列,新名稱不會反映在查詢結果中 - 它會繼續顯示序列的原始名稱。任何想法為什麼?

在評論中,a_horse_with_no_name說:

您使用的是 Greenplum 還是 Postgres?在 Postgres 中,您可以使用pg_get_serial_sequence

你可以在這裡找到文件。

pg_get_serial_sequence返回與列關聯的序列的名稱,如果沒有序列與列關聯,則返回 NULL。第一個輸入參數是帶有可選模式的表名,第二個參數是列名。因為第一個參數可能是模式和表,所以它不被視為雙引號標識符,這意味著預設情況下它是小寫的,而第二個參數只是一個列名,被視為雙引號並具有它的案例保存。該函式返回一個適當格式化的值以傳遞給序列函式(參見第 9.16 節)。可以使用 修改或刪除此關聯ALTER SEQUENCE OWNED BY。(該函式可能應該被呼叫pg_get_owned_sequence;它的目前名稱反映了它通常與serialorbigserial列一起使用的事實。)

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