PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Trova il nome della tabella di riferimento utilizzando la tabella, il campo e il nome dello schema

Se non hai bisogno che questo sia portabile su un altro RDBMS, è molto più veloce e più semplice utilizzare le tabelle del catalogo in pg_catalog invece dello schema informativo 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;

Resi:

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

Note

  • Le due colonne aggiuntive sono solo di orientamento. Secondo la tua Q, hai solo bisogno della prima colonna.

  • Questo restituisce tutto tabelle referenziate da tutte le chiavi esterne che coinvolgono il nome di colonna specificato, inclusi i vincoli FK su più colonne.

  • Il nome viene qualificato automaticamente dallo schema o meno in base alla visibilità impostata dal search_path corrente . Anche il nome viene evitato dove necessario (caratteri illegali o maiuscoli, parole riservate, ...).

Controlla i dettagli di pg_constraint e pg_attribute nel manuale. E anche di più sui tipi di identificatori di oggetti.

Correlati:

  • vincolo di rilascio PostgreSQL con nome sconosciuto
  • Recupero di tutti i PK e FK