Se você não precisa que isso seja portátil para outro RDBMS, é muito mais rápido e simples de usar as tabelas de catálogo em
pg_catalog
em vez do esquema de informações padrão:SELECT c.confrelid::regclass::text AS referenced_table
, c.conname AS fk_name
, pg_get_constraintdef(c.oid) AS fk_definition
FROM pg_attribute a
JOIN pg_constraint c ON (c.conrelid, c.conkey[1]) = (a.attrelid, a.attnum)
WHERE a.attrelid = '"Schema2"."TableB"'::regclass -- table name
AND a.attname = 'A_Id' -- column name
AND c.contype = 'f'
ORDER BY conrelid::regclass::text, contype DESC;
Devoluções:
referenced_table | fk_name | fk_definition
------------------+-------------------------+----------------------------------------------
Schema1.TableA | b1_fkey | FOREIGN KEY ("B_id") REFERENCES "Schema1"."TableA"("A_id")
Observações
-
As duas colunas adicionais são apenas para orientação. De acordo com o seu Q, você só precisa da primeira coluna.
-
Isso retorna todos tabelas referenciadas por todas as chaves estrangeiras que envolvem o nome de coluna fornecido - incluindo restrições FK em várias colunas.
-
O nome é automaticamente qualificado pelo esquema ou não de acordo com a visibilidade definida pelosearch_path
atual . O nome também é escapado quando necessário (caracteres ilegais ou maiúsculos, palavras reservadas, ...) automaticamente também.
Confira os detalhes de
pg_constraint
e pg_attribute
no manual. E mais sobre os tipos de identificador de objeto também. Relacionado:
- Restrição de descarte do PostgreSQL com nome desconhecido
- Recuperando todos os PK e FK