2016-11-29 2 views
1

У меня есть список внешних ключей. Я хотел бы узнать таблицы, на которые указывают эти FK, и фактический ключ.Получение ссылочных таблиц в Postgres

У меня есть список FK как так:

columnName0, columnName1, columnName2 

Иностранные ключевые ссылки

  • columnName0 ссылки table0.idTable0
  • columnName1 ссылки table1.idTable1
  • columnName2 ссылки table2.idTable2

Некоторые примеры таблиц:

Table0:

idTable0, PK 
name 

Table1:

idTable1, PK 
age 

Table2:

idTable2, PK 
createdOn 

Образец результата:

| column  | referenced_column | referenced_table | 
|-------------|-------------------|------------------| 
| columnName0 | idTable0   | table0   | 
| columnName1 | idTable1   | table1   | 
| columnName2 | idTable2   | table2   | 

Я пытаюсь перевести что-то, что я делаю в MySQL, как это:

SELECT DISTINCT 
    COLUMN_NAME AS column, 
    REFERENCED_COLUMN_NAME AS referenced_column, 
    REFERENCED_TABLE_NAME AS referenced_table 
FROM 
    INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE 
    COLUMN_NAME IN (?); 

я собираюсь должны использовать прямые запросы вверх (к сожалению, , никаких хранимых процедур).

ответ

1

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

select 
    conrelid::regclass table_name, 
    a1.attname column_name, 
    confrelid::regclass referenced_table, 
    a2.attname referenced_column, 
    conname constraint_name 
from (
    select conname, conrelid::regclass, confrelid::regclass, col, fcol 
    from pg_constraint c, 
    lateral unnest(conkey) col, 
    lateral unnest(confkey) fcol 
    where contype = 'f' -- foreign keys constraints 
    ) s 
join pg_attribute a1 on a1.attrelid = conrelid and a1.attnum = col 
join pg_attribute a2 on a2.attrelid = confrelid and a2.attnum = fcol; 

table_name | column_name | referenced_table | referenced_column | constraint_name  
------------+-------------+------------------+-------------------+------------------------ 
products | image_id | images   | id    | products_image_id_fkey 
(1 row) 

В Postgres 9.4 или более поздней версии функция unnest() может иметь несколько аргументов и внутренний запрос может выглядеть следующим образом:

... 
    select conname, conrelid::regclass, confrelid::regclass, col, fcol 
    from pg_constraint c, 
    lateral unnest(conkey, confkey) u(col, fcol) 
    where contype = 'f' -- foreign keys constraints 
... 
+0

PostgreSQL поддерживает представления информации схемы. –

+0

@ MikeSherrill'CatRecall '- да, это так, см. [Список грантов и привилегий для материализованного представления в PostgreSQL] (http://stackoverflow.com/a/38854833/1995738) – klin

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