sql >> Databasteknik >  >> RDS >> PostgreSQL

Hitta det refererade tabellnamnet med hjälp av tabell-, fält- och schemanamn

Om du inte behöver detta för att vara portabelt till ett annat RDBMS är det mycket snabbare och enklare att använda katalogtabellerna i pg_catalog istället för standardinformationsschemat:

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;

Returnerar:

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

Anteckningar

  • De ytterligare två kolumnerna är endast för orientering. Enligt din Q behöver du bara den första kolumnen.

  • Detta returnerar alla refererade tabeller av alla främmande nycklar som involverar det givna kolumnnamnet - inklusive FK-begränsningar på flera kolumner.

  • Namnet är automatiskt schemakvalificerat eller inte enligt synligheten som ställts in av den aktuella search_path . Namnet escapes också vid behov (olagliga eller versaler, reserverade ord, ...) också automatiskt.

Kolla in information om pg_constraint och pg_attribute i manualen. Och mer om objektidentifieringstyper också.

Relaterat:

  • PostgreSQL-släppbegränsning med okänt namn
  • Hämtar alla PK och FK



  1. MySQL Ändra samling av alla tabeller

  2. Förhindra SQL-injektionsattacker i ett Java-program

  3. Ändra PostgreSql-databaskodning

  4. Ställa in databasåtkomstbehörigheter