PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Encontre o nome da tabela referenciada usando o nome da tabela, do campo e do esquema


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 pelo search_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