列出所有外键 PostgreSQL
List all foreign keys PostgreSQL
我需要一个 returns:
的查询
"table_name"、"field_name"、"field_type"、"contraint_name"
到目前为止我有:
select conrelid::regclass AS table_name,
regexp_replace(pg_get_constraintdef(c.oid), '.*\((.*)\)', '') as fields,
conname as contraint_name
from pg_constraint c
join pg_namespace n ON n.oid = c.connamespace
join pg_attribute at on
--join pg_type t ON t.typnamespace = n.oid
where contype ='f'
一个外键可能基于多个列,所以pg_constraint
的conkey
和confkey
是数组。您必须取消嵌套数组才能获得列名或类型的列表。您可以使用这些功能:
create or replace function get_col_names(rel regclass, cols int2[])
returns text language sql as $$
select string_agg(attname, ', ' order by ordinality)
from pg_attribute,
unnest(cols) with ordinality
where attrelid = rel
and attnum = unnest
$$;
create or replace function get_col_types(rel regclass, cols int2[])
returns text language sql as $$
select string_agg(typname, ', ' order by ordinality)
from pg_attribute a
join pg_type t on t.oid = atttypid,
unnest(cols) with ordinality
where attrelid = rel
and attnum = unnest
$$;
查询约束和索引时,这些函数可能非常方便。你的查询对他们来说很好很简单:
select
conrelid::regclass,
get_col_names(conrelid, conkey) col_names,
get_col_types(conrelid, conkey) col_types,
conname
from pg_constraint
where contype ='f';
conrelid | col_names | col_types | conname
----------+-----------+-----------+------------------------
products | image_id | int4 | products_image_id_fkey
(1 row)
我需要一个 returns:
的查询"table_name"、"field_name"、"field_type"、"contraint_name"
到目前为止我有:
select conrelid::regclass AS table_name,
regexp_replace(pg_get_constraintdef(c.oid), '.*\((.*)\)', '') as fields,
conname as contraint_name
from pg_constraint c
join pg_namespace n ON n.oid = c.connamespace
join pg_attribute at on
--join pg_type t ON t.typnamespace = n.oid
where contype ='f'
一个外键可能基于多个列,所以pg_constraint
的conkey
和confkey
是数组。您必须取消嵌套数组才能获得列名或类型的列表。您可以使用这些功能:
create or replace function get_col_names(rel regclass, cols int2[])
returns text language sql as $$
select string_agg(attname, ', ' order by ordinality)
from pg_attribute,
unnest(cols) with ordinality
where attrelid = rel
and attnum = unnest
$$;
create or replace function get_col_types(rel regclass, cols int2[])
returns text language sql as $$
select string_agg(typname, ', ' order by ordinality)
from pg_attribute a
join pg_type t on t.oid = atttypid,
unnest(cols) with ordinality
where attrelid = rel
and attnum = unnest
$$;
查询约束和索引时,这些函数可能非常方便。你的查询对他们来说很好很简单:
select
conrelid::regclass,
get_col_names(conrelid, conkey) col_names,
get_col_types(conrelid, conkey) col_types,
conname
from pg_constraint
where contype ='f';
conrelid | col_names | col_types | conname
----------+-----------+-----------+------------------------
products | image_id | int4 | products_image_id_fkey
(1 row)