Не гарантируется, что другие решения будут работать в postgresql , так как не гарантируется, что имя_ограничения будет уникальным;Таким образом, вы получите ложные срабатывания.PostgreSQL называл ограничения глупыми вещами, такими как '$ 1', и если у вас есть старая база данных, которую вы поддерживали с помощью обновлений, у вас, вероятно, все еще есть некоторые из них.
Поскольку этот вопрос был нацелен на ATPostgreSQL и это то, что вы используете, затем вы можете запросить внутренние таблицы postgres pg_class и pg_attribute, чтобы получить более точный результат.
ПРИМЕЧАНИЕ: FK могут быть на нескольких столбцах, таким образом, ссылочный столбец (attnum of pg_attribute) является массивом, который является причиной использования array_agg в ответе.
Единственное, что вам нужно подключить, это TARGET_TABLE_NAME:
select
(select r.relname from pg_class r where r.oid = c.conrelid) as table,
(select array_agg(attname) from pg_attribute
where attrelid = c.conrelid and ARRAY[attnum] <@ c.conkey) as col,
(select r.relname from pg_class r where r.oid = c.confrelid) as ftable
from pg_constraint c
where c.confrelid = (select oid from pg_class where relname = 'TARGET_TABLE_NAME');
Если вы хотите пойти другим путем(перечислите все вещи, на которые ссылается конкретная таблица), затем просто измените последнюю строку на:
where c.conrelid = (select oid from pg_class where relname = 'TARGET_TABLE_NAME');
О, и, поскольку фактический вопрос был нацелен на конкретный столбец, вы можете указать имя столбцас этим:
select (select r.relname from pg_class r where r.oid = c.conrelid) as table,
(select array_agg(attname) from pg_attribute
where attrelid = c.conrelid and ARRAY[attnum] <@ c.conkey) as col,
(select r.relname from pg_class r where r.oid = c.confrelid) as ftable
from pg_constraint c
where c.confrelid = (select oid from pg_class where relname = 'TARGET_TABLE_NAME') and
c.confkey @> (select array_agg(attnum) from pg_attribute
where attname = 'TARGET_COLUMN_NAME' and attrelid = c.confrelid);