Existe-t-il un moyen d'utiliser SQL pour répertorier toutes les clés étrangères pour une table donnée? Je connais le nom / schéma de la table et je peux le brancher.
sql
postgresql
smack0007
la source
la source
Réponses:
Vous pouvez le faire via les tables information_schema. Par exemple:
la source
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 fait cela, et si vous démarrez psql avec:
il vous montrera exactement quelle requête est exécutée. Dans le cas de la recherche de clés étrangères, c'est:
Dans ce cas, 16485 est l'oid de la table que je regarde - vous pouvez l'obtenir en moulant simplement votre nom de table en regclass comme:
Qualifiez le nom du tableau s'il n'est pas unique (ou le premier de votre nom
search_path
):la source
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
?Problème
\d+ tablename
sur l'invite PostgreSQL, en plus d'afficher les types de données de la colonne de table, il affichera les index et les clés étrangères.la source
La réponse d'Ollyc est bonne car elle n'est pas spécifique à Postgres, cependant, elle tombe en panne lorsque la clé étrangère fait référence à plus d'une colonne. La requête suivante fonctionne pour un nombre arbitraire de colonnes mais elle s'appuie fortement sur les extensions Postgres:
la source
Extension à la recette ollyc:
Ensuite:
SELECT * FROM foreign_keys_view WHERE table_name='YourTableNameHere'
;la source
consultez le post ff pour votre solution et n'oubliez pas de le marquer lorsque vous affinez cette utile
http://errorbank.blogspot.com/2011/03/list-all-foreign-keys-references-for.html
la source
Cette requête fonctionne également correctement avec les clés composites:
la source
Je pense que ce que vous cherchiez et très proche de ce que @ollyc a écrit est le suivant:
Ceci listera toutes les tables qui utilisent votre table spécifiée comme clé étrangère
la source
vote positif court mais doux si cela fonctionne pour vous.
la source
Aucune des réponses existantes ne m'a donné les résultats sous la forme dans laquelle je les souhaitais. Voici donc ma requête (gargantuesque) pour trouver des informations sur les clés étrangères.
Quelques notes:
from_cols
etto_cols
pourraient être considérablement simplifiées sur Postgres 9.4 etWITH ORDINALITY
versions ultérieures en utilisant plutôt que le piratage utilisant la fonction fenêtre que j'utilise.UNNEST
. Je ne pense pas que ce sera le cas, mais je n'ai pas de clés étrangères à plusieurs colonnes dans mon ensemble de données avec lesquelles tester. L'ajout des subtilités 9.4 élimine complètement cette possibilité.ORDER BY
dans les fonctions d'agrégation)STRING_AGG
parARRAY_AGG
si vous voulez un tableau de colonnes plutôt qu'une chaîne séparée par des virgules.-
la source
Une autre façon:
la source
Vous pouvez utiliser les catalogues système PostgreSQL . Vous pouvez peut-être interroger pg_constraint pour demander des clés étrangères. Vous pouvez également utiliser le schéma d'information
la source
Utilisez le nom de la clé primaire à laquelle les clés font référence et interrogez le schéma_information:
Ici, «TABLE_NAME_pkey» est le nom de la clé primaire référencée par les clés étrangères.
la source
Voici une solution d'Andreas Joseph Krogh de la liste de diffusion PostgreSQL: http://www.postgresql.org/message-id/[email protected]
Cette solution gère les clés étrangères qui référencent plusieurs colonnes et évite les doublons (ce que certaines des autres réponses ne parviennent pas à faire). La seule chose que j'ai changé, ce sont les noms de variables.
Voici un exemple qui renvoie toutes les
employee
colonnes qui référencent lapermission
table:la source
Pour développer l'excellente réponse de Martin, voici une requête qui vous permet de filtrer en fonction de la table parent et vous montre le nom de la table enfant avec chaque table parent afin que vous puissiez voir toutes les tables / colonnes dépendantes en fonction des contraintes de clé étrangère dans la table parent.
la source
Solution appropriée au problème, en utilisant
information_schema
, en travaillant avec des clés multi-colonnes, en joignant correctement des colonnes de noms différents dans les deux tables et également compatible avec ms sqlsever:Remarque: Il existe certaines différences entre les implémentations potgresql et sqlserver,
information_schema
ce qui fait que la première réponse donne des résultats différents sur les deux systèmes - l'un affiche les noms de colonne pour la table de clés étrangères, l'autre pour la table de clés primaires. Pour cette raison, j'ai décidé d'utiliser à la place la vue KEY_COLUMN_USAGE.la source
ORDINAL_POSITION
peut donner un résultat incorrect lorsque l'ordre des colonnes dans la clé étrangère est différent de l'ordre des colonnes dans la contrainte unique. Je pense que vous auriez dû vous joindre à lakcu_foreign.POSITION_IN_UNIQUE_CONSTRAINT = kcu_primary.ORDINAL_POSITION
mise à jour : En outre, une clé étrangère peut également dépendre d'une contrainte UNIQUE, donc je pense que vous devriez supprimer lapks.CONSTRAINT_TYPE
condition et que vous pouvez simplement vous joindrerc
àkcu_primary
directementla source
J'ai écrit une solution qui aime et utilise fréquemment. Le code se trouve à http://code.google.com/p/pgutils/ . Voir la vue pgutils.foreign_keys.
Malheureusement, la sortie est trop verbeuse pour être incluse ici. Cependant, vous pouvez l'essayer sur une version publique de la base de données ici, comme ceci:
Cela fonctionne avec 8.3 au moins. Je prévois de le mettre à jour, si nécessaire, dans les prochains mois.
-Receece
la source
J'ai créé un petit outil pour interroger puis comparer le schéma de la base de données: vidage du schéma db PostgreSQL au texte
Il y a des informations sur FK, mais la réponse ollyc donne plus de détails.
la source
Remarque: N'oubliez pas l'ordre des colonnes lors de la lecture des colonnes de contraintes!
la source
Voici ce que j'utilise actuellement, il listera une table et ses contraintes fkey [supprimer la clause table et listera toutes les tables du catalogue actuel]:
la source
le plus rapide à vérifier directement dans la réponse bash basée entièrement sur cette réponse
la source