web-dev-qa-db-ja.com

シリアル列のシーケンス名を取得する方法

私の知る限り、このクエリはシリアル列の新しい値の式を表示する必要があります。

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'
;

ほとんどの場合機能しますが、シーケンスの名前を変更しても、新しい名前はクエリの結果に反映されません。シーケンスの元の名前が引き続き表示されます。何かアイデアはありますか?

5
PhilHibbs

コメントでは、 a_horse_with_no_name が言っています:

GreenplumまたはPostgresを使用していますか? Postgresではpg_get_serial_sequenceを使用できます

あなたは見つけることができます ドキュメントはここにあります。

pg_get_serial_sequenceは、列に関連付けられているシーケンスの名前を返します。列に関連付けられているシーケンスがない場合は、NULLを返します。最初の入力パラメーターはオプションのスキーマを含むテーブル名で、2番目のパラメーターは列名です。最初のパラメーターはスキーマとテーブルになる可能性があるため、二重引用符で囲まれた識別子として扱われません。つまり、デフォルトでは小文字になります。一方、2番目のパラメーターは列名だけなので、二重引用符で囲まれて扱われます。保持されたケース。この関数は、シーケンス関数に渡すために適切にフォーマットされた値を返します( セクション9.16 を参照)。この関連付けは、ALTER SEQUENCE OWNED BYを使用して変更または削除できます。 (この関数はおそらくpg_get_owned_sequenceと呼ばれるべきでした。現在の名前は、通常serialまたはbigserial列で使用されるという事実を反映しています。)

5
Evan Carroll