Czy istnieje sposób używania SQL do wyświetlania listy wszystkich kluczy obcych dla danej tabeli? Znam nazwę / schemat tabeli i mogę to podłączyć.
sql
postgresql
smack0007
źródło
źródło
Odpowiedzi:
Możesz to zrobić za pomocą tabel Information_schema. Na przykład:
źródło
FROM information_schema.table_constraints AS tc JOIN information_schema.key_column_usage AS kcu USING (constraint_schema, constraint_name) JOIN information_schema.constraint_column_usage AS ccu USING (constraint_schema, constraint_name)
psql to robi, a jeśli uruchomisz psql:
pokaże dokładnie, jakie zapytanie jest wykonywane. W przypadku znalezienia kluczy obcych jest to:
W tym przypadku 16485 jest oid stołu, na który patrzę - możesz go zdobyć, po prostu rzucając tablename, aby zmienić klasę:
Schemat kwalifikuj nazwę tabeli, jeśli nie jest unikalna (lub pierwsza w twoim
search_path
):źródło
SELECT conname, pg_catalog.pg_get_constraintdef(r.oid, true) as condef FROM pg_catalog.pg_constraint r WHERE r.confrelid = 'myschema.mytable'::regclass;
psql -E -U username -d database ThenWHAT
?Problem
\d+ tablename
z pytaniem PostgreSQL, oprócz pokazywania typów danych kolumny tabeli, pokazuje indeksy i klucze obce.źródło
Odpowiedź Ollyca jest dobra, ponieważ nie jest specyficzna dla Postgresa, ale ulega awarii, gdy klucz obcy odnosi się do więcej niż jednej kolumny. Poniższe zapytanie działa dla dowolnej liczby kolumn, ale w dużej mierze opiera się na rozszerzeniach Postgres:
źródło
Rozszerzenie przepisu ollyc:
Następnie:
SELECT * FROM foreign_keys_view WHERE table_name='YourTableNameHere'
;źródło
sprawdź post ff dla swojego rozwiązania i nie zapomnij zaznaczyć tego, gdy okaże się to pomocne
http://errorbank.blogspot.com/2011/03/list-all-foreign-keys-references-for.html
źródło
To zapytanie działa poprawnie również z kluczami złożonymi:
źródło
Myślę, że to, czego szukałeś i bardzo blisko tego, co napisał @ollyc, to:
Spowoduje to wyświetlenie listy wszystkich tabel, które używają określonej tabeli jako klucza obcego
źródło
krótki, ale słodki głos, jeśli to działa.
źródło
Żadna z istniejących odpowiedzi nie dała mi wyników w takiej formie, w jakiej naprawdę ich chciałem. Oto moje (gigantyczne) zapytanie o znalezienie informacji o obcych kluczach.
Kilka uwag:
from_cols
ito_cols
można je znacznie uprościć w Postgresie 9.4 i nowszych przyWITH ORDINALITY
użyciu hakerów zamiast funkcji okna, których używam.UNNEST
. Nie sądzę, że tak będzie, ale w zestawie danych nie mam żadnych kluczy obcych z wieloma kolumnami. Dodanie 9,4 subtelności całkowicie eliminuje tę możliwość.ORDER BY
na funkcje agregujące)STRING_AGG
sięARRAY_AGG
jeśli chcesz tablicę kolumn zamiast ciąg oddzielonych przecinkami.-
źródło
Jeszcze jeden sposób:
źródło
Możesz użyć katalogów systemowych PostgreSQL . Może możesz zapytać pg_constraint o zapytanie o klucze obce. Możesz także użyć schematu informacyjnego
źródło
Użyj nazwy klucza głównego, do którego odwołują się klucze, i prześlij zapytanie do schematu informacyjnego:
Tutaj „TABLE_NAME_pkey” to nazwa klucza podstawowego, do którego odwołują się klucze obce.
źródło
Oto rozwiązanie Andreasa Josepha Krogha z listy mailingowej PostgreSQL: http://www.postgresql.org/message-id/[email protected]
To rozwiązanie obsługuje klucze obce, które odwołują się do wielu kolumn, i pozwala uniknąć duplikatów (czego niektóre inne odpowiedzi nie robią). Jedyne, co zmieniłem, to nazwy zmiennych.
Oto przykład, który zwraca wszystkie
employee
kolumny, które odwołują się dopermission
tabeli:źródło
Aby rozwinąć doskonałą odpowiedź Martina tutaj, jest zapytanie, które pozwala filtrować na podstawie tabeli nadrzędnej i pokazuje nazwę tabeli podrzędnej z każdą tabelą nadrzędną, dzięki czemu można zobaczyć wszystkie zależne tabele / kolumny na podstawie ograniczeń klucza obcego w stół nadrzędny.
źródło
Właściwe rozwiązanie problemu, używanie
information_schema
, praca z kluczami wielokolumnowymi, prawidłowe łączenie kolumn o różnych nazwach w obu tabelach, a także kompatybilność z ms sqlsever:Uwaga: Istnieją pewne różnice między implementacjami potgresql i sqlserver, z
information_schema
których pierwsza odpowiedź daje różne wyniki w dwóch systemach - jedna pokazuje nazwy kolumn dla tabeli kluczy obcych, a druga dla tabeli kluczy podstawowych. Z tego powodu postanowiłem użyć zamiast tego widoku KEY_COLUMN_USAGE.źródło
ORDINAL_POSITION
może dawać niepoprawny wynik, gdy kolejność kolumn w kluczu obcym różni się od kolejności kolumn w ograniczeniu unikalnym. Wierzę, że nie powinno być połączone nakcu_foreign.POSITION_IN_UNIQUE_CONSTRAINT = kcu_primary.ORDINAL_POSITION
aktualizacji : Również, klucz obcy może zależeć od ograniczeń UNIQUE, tak więc myślę, że należy usunąćpks.CONSTRAINT_TYPE
warunek i można po prostu dołączyćrc
dokcu_primary
bezpośrednioźródło
Napisałem rozwiązanie, które często lubi i używa. Kod znajduje się na stronie http://code.google.com/p/pgutils/ . Zobacz widok pgutils.foreign_keys.
Niestety, wynik jest zbyt trudny, aby go tutaj uwzględnić. Możesz jednak wypróbować go w publicznej wersji bazy danych tutaj:
Działa to przynajmniej z 8.3. Przewiduję aktualizację w razie potrzeby w ciągu najbliższych kilku miesięcy.
-Reece
źródło
Stworzyłem małe narzędzie do wyszukiwania, a następnie porównywania schematu bazy danych: Zrzuć schemat DB PostgreSQL na tekst
Są informacje o FK, ale odpowiedź ollyc podaje więcej szczegółów.
źródło
Uwaga: Nie zapomnij o kolejności kolumn podczas czytania kolumn z ograniczeniami!
źródło
To jest to, czego aktualnie używam, wyświetli tabelę i jej ograniczenia Fkey [usuń klauzulę tabeli i wyświetli wszystkie tabele w bieżącym katalogu]:
źródło
najszybszy do zweryfikowania bezpośrednio w odpowiedzi bash oparty w całości na tej odpowiedzi
źródło