Как выполнить SQL-запрос для поиска всех внешних ключей (Foreign Keys) в конкретной таблице базы данных PostgreSQL?
В PostgreSQL существует несколько способов получить информацию о внешних ключах (Foreign Keys) конкретной таблицы. Рассмотрим наиболее распространённые и удобные подходы.
**Способ 1: Через системный каталог pg_constraint**
Это наиболее гибкий и детальный способ. Запрос обращается к системным таблицам pg_constraint, pg_class и pg_attribute:
sql
SELECT
tc.conname AS constraint_name,
kcu.column_name AS column_name,
ccu.table_name AS foreign_table_name,
ccu.column_name AS foreign_column_name
FROM
pg_constraint tc
JOIN pg_class rel ON rel.oid = tc.conrelid
JOIN pg_namespace nsp ON nsp.oid = rel.relnamespace
JOIN information_schema.key_column_usage kcu
ON kcu.constraint_name = tc.conname
JOIN information_schema.constraint_column_usage ccu
ON ccu.constraint_name = tc.conname
WHERE
tc.contype = ‘f’
AND rel.relname = ‘your_table_name’;
Здесь `contype = ‘f’` означает именно Foreign Key. Замените `your_table_name` на имя вашей таблицы.
**Способ 2: Через information_schema (стандартный SQL)**
Более переносимый вариант, работающий и в других СУБД:
sql
SELECT
kcu.constraint_name,
kcu.column_name,
ccu.table_name AS referenced_table,
ccu.column_name AS referenced_column,
rc.update_rule,
rc.delete_rule
FROM
information_schema.table_constraints tc
JOIN information_schema.key_column_usage kcu
ON tc.constraint_name = kcu.constraint_name
AND tc.table_schema = kcu.table_schema
JOIN information_schema.referential_constraints rc
ON tc.constraint_name = rc.constraint_name
JOIN information_schema.constraint_column_usage ccu
ON rc.unique_constraint_name = ccu.constraint_name
WHERE
tc.constraint_type = ‘FOREIGN KEY’
AND tc.table_name = ‘your_table_name’
AND tc.table_schema = ‘public’;
Этот запрос также возвращает правила обновления и удаления (CASCADE, SET NULL, RESTRICT и т.д.).
**Способ 3: Через psql-команду d**
Если вы работаете в консоли psql, проще всего использовать мета-команду:
d your_table_name
В выводе будет секция «Foreign-key constraints» со всеми внешними ключами таблицы.
**Поиск таблиц, ссылающихся на вашу таблицу**
Чтобы найти все таблицы, которые ссылаются на вашу таблицу (обратные FK), используйте:
sql
SELECT
tc.table_name AS referencing_table,
kcu.column_name AS referencing_column,
ccu.column_name AS referenced_column
FROM
information_schema.table_constraints tc
JOIN information_schema.key_column_usage kcu
ON tc.constraint_name = kcu.constraint_name
JOIN information_schema.constraint_column_usage ccu
ON tc.constraint_name = ccu.constraint_name
WHERE
tc.constraint_type = ‘FOREIGN KEY’
AND ccu.table_name = ‘your_table_name’;
**Итог:** для большинства задач рекомендуется использовать запрос через `information_schema` — он стандартизирован и понятен. Для более глубокого анализа и производительности — системные каталоги `pg_constraint`.
