PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Trouver le nom de la table référencée à l'aide du nom de la table, du champ et du schéma

Si vous n'avez pas besoin que cela soit portable vers un autre RDBMS, c'est beaucoup utilisation plus rapide et plus simple des tables de catalogue dans pg_catalog au lieu du schéma d'information standard :

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;

Renvoie :

 referenced_table | fk_name  |  fk_definition
------------------+-------------------------+----------------------------------------------
 Schema1.TableA   | b1_fkey  | FOREIGN KEY ("B_id") REFERENCES "Schema1"."TableA"("A_id")

Remarques

  • Les deux colonnes supplémentaires servent uniquement à l'orientation. Selon votre Q, vous n'avez besoin que de la première colonne.

  • Cela renvoie tous tables référencées par toutes les clés étrangères impliquant le nom de colonne donné - y compris les contraintes FK sur plusieurs colonnes.

  • Le nom est automatiquement qualifié de schéma ou non selon la visibilité définie par le search_path courant . Le nom est également échappé si nécessaire (caractères illégaux ou majuscules, mots réservés, ...) automatiquement aussi.

Consultez les détails de pg_constraint et pg_attribute dans le manuel. Et plus sur les types d'identificateurs d'objets également.

Connexe :

  • Contrainte de suppression PostgreSQL avec un nom inconnu
  • Récupération de tous les PK et FK