Gibt es eine Möglichkeit, mit SQL alle Fremdschlüssel für eine bestimmte Tabelle aufzulisten? Ich kenne den Tabellennamen / das Schema und kann das einstecken.
sql
postgresql
smack0007
quelle
quelle
Antworten:
Sie können dies über die Tabellen information_schema tun. Beispielsweise:
quelle
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 macht das und wenn Sie psql starten mit:
Es zeigt Ihnen genau, welche Abfrage ausgeführt wird. Wenn Sie Fremdschlüssel finden, ist dies:
In diesem Fall ist 16485 die Oid der Tabelle, die ich betrachte. Sie können diese erhalten, indem Sie einfach Ihren Tabellennamen in eine neue Klasse umwandeln:
Schema-qualifizieren Sie den Tabellennamen, wenn er nicht eindeutig ist (oder der erste in Ihrem
search_path
):quelle
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
bei der PostgreSQL-Eingabeaufforderung Zusätzlich zur Anzeige der Datentypen der Tabellenspalte werden die Indizes und Fremdschlüssel angezeigt.quelle
Ollycs Antwort ist gut, da sie nicht Postgres-spezifisch ist. Sie bricht jedoch zusammen, wenn der Fremdschlüssel auf mehr als eine Spalte verweist. Die folgende Abfrage funktioniert für eine beliebige Anzahl von Spalten, hängt jedoch stark von Postgres-Erweiterungen ab:
quelle
Erweiterung des Ollyc-Rezepts:
Dann:
SELECT * FROM foreign_keys_view WHERE table_name='YourTableNameHere'
;;quelle
Überprüfen Sie den ff-Beitrag auf Ihre Lösung und vergessen Sie nicht, dies zu markieren, wenn Sie dies hilfreich finden
http://errorbank.blogspot.com/2011/03/list-all-foreign-keys-references-for.html
quelle
Diese Abfrage funktioniert auch mit zusammengesetzten Schlüsseln korrekt:
quelle
Ich denke, was Sie gesucht haben und sehr nah an dem, was @ollyc geschrieben hat, ist Folgendes:
Dadurch werden alle Tabellen aufgelistet, die Ihre angegebene Tabelle als Fremdschlüssel verwenden
quelle
kurze aber süße Gegenstimme, wenn es für Sie funktioniert.
quelle
Keine der vorhandenen Antworten gab mir Ergebnisse in der Form, in der ich sie eigentlich haben wollte. Hier ist meine (gigantische) Abfrage, um Informationen über Fremdschlüssel zu finden.
Ein paar Anmerkungen:
from_cols
undto_cols
in Postgres 9.4 und höher erheblich vereinfacht werden könnten, verwendenWITH ORDINALITY
nicht das von mir verwendete Fensterfunktions-Hackery.UNNEST
. Ich glaube nicht, dass dies der Fall sein wird, aber ich habe keine mehrspaltigen Fremdschlüssel in meinem Datensatz, mit denen ich testen kann. Das Hinzufügen der 9,4-Feinheiten schließt diese Möglichkeit insgesamt aus.ORDER BY
aggregierten Funktionen zugelassen).STRING_AGG
durch,ARRAY_AGG
wenn Sie ein Array von Spalten anstelle einer durch Kommas getrennten Zeichenfolge möchten.- -
quelle
Ein anderer Weg:
quelle
Sie können die PostgreSQL-Systemkataloge verwenden . Möglicherweise können Sie pg_constraint abfragen , um nach Fremdschlüsseln zu fragen. Sie können auch das Informationsschema verwenden
quelle
Verwenden Sie den Namen des Primärschlüssels, auf den sich die Schlüssel beziehen, und fragen Sie das Informationsschema ab:
Hier ist 'TABLE_NAME_pkey' der Name des Primärschlüssels, auf den die Fremdschlüssel verweisen.
quelle
Hier ist eine Lösung von Andreas Joseph Krogh aus der PostgreSQL-Mailingliste: http://www.postgresql.org/message-id/[email protected]
Diese Lösung verarbeitet Fremdschlüssel, die auf mehrere Spalten verweisen, und vermeidet Duplikate (was bei einigen anderen Antworten nicht der Fall ist). Das einzige, was ich geändert habe, waren die Variablennamen.
Hier ist ein Beispiel, das alle
employee
Spalten zurückgibt , die auf diepermission
Tabelle verweisen :quelle
Um Martins hervorragende Antwort zu erweitern, finden Sie hier eine Abfrage, mit der Sie basierend auf der übergeordneten Tabelle filtern und den Namen der untergeordneten Tabelle für jede übergeordnete Tabelle anzeigen können, damit Sie alle abhängigen Tabellen / Spalten basierend auf den Fremdschlüsseleinschränkungen in sehen können die übergeordnete Tabelle.
quelle
Richtige Lösung des Problems: Verwenden
information_schema
, Arbeiten mit mehrspaltigen Schlüsseln, korrektes Verknüpfen von Spalten mit unterschiedlichen Namen in beiden Tabellen und Kompatibilität mit ms sqlsever:Hinweis: Es gibt einige Unterschiede zwischen Potgresql- und SQLServer-Implementierungen, bei
information_schema
denen die Top-Antwort auf beiden Systemen unterschiedliche Ergebnisse liefert - einer zeigt die Spaltennamen für die Fremdschlüsseltabelle, der andere für die Primärschlüsseltabelle. Aus diesem Grund habe ich mich stattdessen für die Ansicht KEY_COLUMN_USAGE entschieden.quelle
ORDINAL_POSITION
kann zu einem falschen Ergebnis führen, wenn sich die Reihenfolge der Spalten im Fremdschlüssel von der Reihenfolge der Spalten in der eindeutigen Einschränkung unterscheidet. Ich glaube , Sie beigetreten sind , solltenkcu_foreign.POSITION_IN_UNIQUE_CONSTRAINT = kcu_primary.ORDINAL_POSITION
aktualisieren : Auch ein Fremdschlüssel als auch auf einem UNIQUE - Einschränkung abhängen kann, so dass ich denke , Sie entfernen solltenpks.CONSTRAINT_TYPE
Zustand und nur anschließen kann ,rc
umkcu_primary
direktquelle
Ich habe eine Lösung geschrieben, die ich mag und häufig benutze. Der Code befindet sich unter http://code.google.com/p/pgutils/ . Siehe die Ansicht pgutils.foreign_keys.
Leider ist die Ausgabe zu wortreich, um sie hier aufzunehmen. Sie können es jedoch hier in einer öffentlichen Version der Datenbank wie folgt ausprobieren:
Dies funktioniert mindestens mit 8.3. Ich erwarte, es bei Bedarf in den nächsten Monaten zu aktualisieren.
-Reece
quelle
Ich habe ein kleines Tool erstellt, um das Datenbankschema abzufragen und dann zu vergleichen: Dump PostgreSQL- Datenbankschema mit Text
Es gibt Informationen über FK, aber die ollyc-Antwort enthält weitere Details.
quelle
Hinweis: Vergessen Sie beim Lesen von Einschränkungsspalten nicht die Reihenfolge der Spalten!
quelle
Dies ist, was ich derzeit verwende, es wird eine Tabelle und ihre fkey-Einschränkungen auflisten [Tabellenklausel entfernen und alle Tabellen im aktuellen Katalog auflisten]:
quelle
Die am schnellsten zu überprüfende Bash-Antwort, die vollständig auf dieser Antwort basiert
quelle