Список всех внешних ключей PostgreSQL

Мне нужен запрос, который возвращает:

"table_name", "field_name", "field_type", "contraint_name"

до сих пор у меня есть:

select conrelid::regclass AS table_name,
       regexp_replace(pg_get_constraintdef(c.oid), '.*\((.*)\)', '\1') 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' 

2 ответа

Решение

Внешний ключ может основываться на нескольких столбцах, поэтому conkey а также confkey из pg_constraint являются массивами. Вы должны отложить вложенные массивы, чтобы получить список имен или типов столбцов. Вы можете использовать эти функции:

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)
      SELECT * FROM information_schema.table_constraints
Другие вопросы по тегам