Jeśli nie potrzebujesz tego, aby można go było przenieść do innego RDBMS, to jest dużo szybsze i prostsze w użyciu tabele katalogów w pg_catalog
zamiast standardowego schematu informacyjnego:
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;
Zwroty:
referenced_table | fk_name | fk_definition
------------------+-------------------------+----------------------------------------------
Schema1.TableA | b1_fkey | FOREIGN KEY ("B_id") REFERENCES "Schema1"."TableA"("A_id")
Notatki
-
Dodatkowe dwie kolumny służą wyłącznie do orientacji. Według twojego pytania, potrzebujesz tylko pierwszej kolumny.
-
Zwraca wszystkie tabele, do których odwołują się wszystkie klucze obce dotyczące danej nazwy kolumny - w tym ograniczenia FK na wielu kolumnach.
-
Nazwa jest automatycznie kwalifikowana według schematu lub nie, zgodnie z widocznością ustawioną przez bieżącą
search_path
. Nazwa jest również automatycznie zmieniana w razie potrzeby (nielegalne lub wielkie litery, zastrzeżone słowa, ...) również automatycznie.
Sprawdź szczegóły pg_constraint
i pg_attribute
w instrukcji. I więcej o typach identyfikatorów obiektów.
Powiązane:
- Ograniczenie upuszczania PostgreSQL o nieznanej nazwie
- Pobieranie wszystkich PK i FK