2016-11-08 4 views
1

Мне нужен запрос, который возвращает:Список всех внешних ключей PostgresSQL

"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) 
+0

благодарит klin, ваш ответ был очень полезен – tavogus

Смежные вопросы