Configurer des clés étrangères dans phpMyAdmin?

336

J'installe une base de données en utilisant phpMyAdmin. J'ai deux tables ( fooet bar), indexées sur leurs clés primaires . J'essaie de créer une table relationnelle ( foo_bar) entre eux, en utilisant leurs clés primaires comme clés étrangères.

J'ai créé ces tables en tant que MyISAM, mais j'ai depuis changé les trois en InnoDB, car j'ai lu que MyISAM ne prend pas en charge les clés étrangères. Tous les idchamps le sont INT(11).

Lorsque je choisis la foo_bartable, cliquez sur le lien "Affichage des relations", et essayez de définir les colonnes FK pour être, database.foo.idet database.bar.idil dit "Aucun index défini!" à côté de chaque colonne.

Qu'est-ce que je rate?

Clarification / mise à jour

Par souci de simplicité, je souhaite continuer à utiliser phpMyAdmin. J'utilise actuellement XAMPP, ce qui est assez facile pour me permettre de me concentrer sur PHP / CSS / Javascript, et il est livré avec phpMyAdmin.

De plus, même si je n'ai pas encore pu configurer de clés étrangères explicites, j'ai une table relationnelle et je peux effectuer des jointures comme ceci:

SELECT * 
FROM foo 
INNER JOIN foo_bar 
ON foo.id = foo_bar.foo_id 
INNER JOIN bar
ON foo_bar.bar_id = bar.id;

Cela me met mal à l'aise de ne pas définir explicitement les FK dans la base de données.

Nathan Long
la source

Réponses:

366

Si vous souhaitez utiliser phpMyAdmin pour établir des relations, vous devez faire 2 choses. Tout d'abord, vous devez définir un index sur la colonne de clé étrangère dans la table de référence (donc foo_bar.foo_id, dans votre cas). Ensuite, allez dans la vue relation (dans le tableau de référence) et sélectionnez la colonne référencée (donc dans votre cas foo.id) et les actions on update et on delete.

Je pense que les clés étrangères sont utiles si vous avez plusieurs tables liées les unes aux autres, en particulier, vos scripts de suppression deviendront très courts si vous définissez correctement les options de référencement.

EDIT: Assurez-vous que les deux tables ont le moteur InnoDB sélectionné.

rael_kid
la source
93
Astuce: la vue des relations est un petit lien sous votre table, j'ai eu du mal à la trouver en premier lieu
Mladen Janjetovic
14
À moins que ce lien ne s'affiche pas dans ce cas, assurez-vous que votre table est de type InnoDB (sous l'onglet Opérations de phpMyAdmin) pour que cela ne se produise pas.
muttley91
4
@ muttley91Ma table est InnoDB. J'ai revérifié. Le lien ne s'affiche toujours pas.
afilina
6
@afilina Dans la nouvelle version de phpMyAdmin, il est visible en haut à l'intérieur de l'onglet "Structure", juste en dessous de la ligne d'onglet qui affiche "Parcourir", "Structure", etc.
Astitva Srivastava
226

phpMyAdmin vous permet de définir des clés étrangères en utilisant leur vue "relations". Mais comme MySQL ne prend en charge que les contraintes étrangères sur les tables "INNO DB", la première étape consiste à s'assurer que les tables que vous utilisez sont de ce type.

Pour configurer une clé étrangère afin que la colonne PID d'une table nommée CHILD fasse référence à la colonne ID d'une table nommée PARENT, vous pouvez effectuer les opérations suivantes:

  1. Pour les deux tableaux, allez dans l'onglet opérations et changez leur type en "INNO DB"
  2. Assurez-vous que l'ID est la clé primaire (ou au moins une colonne indexée) de la table PARENT.
  3. Dans la table CHILD, définissez un index pour la colonne PID.
  4. Tout en affichant l'onglet de structure de la table ENFANT, cliquez sur le lien "vue relation" juste au-dessus de la section "ajouter des champs".
  5. Vous recevrez une table où chaque ligne correspond à une colonne indexée dans votre table CLIENT. La première liste déroulante de chaque ligne vous permet de choisir quelle TABLE-> COLONNE les références de colonne indexées. Dans la ligne pour PID, choisissez PARENT-> ID dans la liste déroulante et cliquez sur GO.

En effectuant une exportation sur la table CHILD, vous devriez voir qu'une contrainte de clé étrangère a été créée pour la colonne PID.

awais
la source
2
Wow, chose très importante à savoir. Cette page n'était pas la première chose que j'ai trouvée lorsque je cherchais de l'aide pour ajouter une clé étrangère, je souhaite que cela soit mentionné plus souvent.
user1299656
87

Ceci est un résumé d'un article Wikipedia. Il spécifie les différents types de relations que vous pouvez stipuler dans PHPmyadmin. Je le mets ici parce qu'il est pertinent pour le commentaire de @ Nathan sur la définition des options de clés étrangères pour "lors de la mise à jour / suppression" mais est trop grand pour un commentaire - j'espère que cela aide.

CASCADE

Chaque fois que des lignes de la table principale (référencée) sont supprimées (resp. Mises à jour), les lignes respectives de la table enfant (référençant) avec une colonne de clé étrangère correspondante seront également supprimées (resp. Mises à jour). C'est ce qu'on appelle une suppression en cascade (resp. Mise à jour [2]).

RESTREINDRE

Une valeur ne peut pas être mise à jour ou supprimée lorsqu'une ligne existe dans une table de clés étrangères qui fait référence à la valeur dans la table référencée. De même, une ligne ne peut pas être supprimée tant qu'elle y fait référence à partir d'une table de clés étrangères.

PAS D'ACTION

NO ACTION et RESTRICT se ressemblent beaucoup. La principale différence entre NO ACTION et RESTRICT est que, avec NO ACTION, la vérification d'intégrité référentielle est effectuée après avoir tenté de modifier la table. RESTRICT effectue la vérification avant d'essayer d'exécuter l'instruction UPDATE ou DELETE. Les deux actions référentielles agissent de même si la vérification d'intégrité référentielle échoue: l'instruction UPDATE ou DELETE entraînera une erreur.

SET NULL

Les valeurs de clé étrangère dans la ligne de référence sont définies sur NULL lorsque la ligne référencée est mise à jour ou supprimée. Cela n'est possible que si les colonnes respectives de la table de référence peuvent être annulées. En raison de la sémantique de NULL, une ligne de référence avec NULL dans les colonnes de clé étrangère ne nécessite pas de ligne référencée.

DÉFINIR PAR DEFAUT

Similaire à SET NULL, les valeurs de clé étrangère dans la ligne de référence sont définies sur la valeur par défaut de la colonne lorsque la ligne référencée est mise à jour ou supprimée.

Brett
la source
1
Mieux encore, allez directement à la documentation source de MySQL: dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html
kmoser
63

Dans phpmyadmin, vous pouvez attribuer une clé étrangère simplement par son interface graphique. Cliquez sur le tableau et allez dans l'onglet Structure. trouver la vue des relations juste en dessous du tableau (montré dans l'image ci-dessous).

entrez la description de l'image ici

Vous pouvez attribuer la clé de forgeage dans la zone de liste à côté de la clé primaire (voir l'image ci-dessous). Et enregistrer

entrez la description de l'image ici

requête SQL correspondante générée et exécutée automatiquement.

Nishad Up
la source
17

Pour ceux qui découvrent la base de données .... et doivent MODIFIER une table existante. Beaucoup de choses semblent assez simples, mais il y a toujours quelque chose ... entre A et B.

Avant toute chose, jetez un œil à cela .

  1. Assurez-vous que vous avez P_ID (ID parent sur la table parent et enfant).
  2. Bien sûr, il sera déjà rempli par le parent. Pas nécessairement chez l'enfant d'une manière vraie et définitive. Ainsi, par exemple, P_ID # 3 (peut-être plusieurs fois dans la table enfant pointera-t-il vers le P_ID d'origine sur la table parent).
  3. Allez dans l'onglet SQL (j'utilise phpMyAdmin, devrait être similaire dans d'autres) et exécutez cette commande:

    ALTER TABLE child_table_name    
    ADD FOREIGN KEY (P_ID)   
    REFERENCES parent_table_name (P_ID)
  4. Cliquez sur la table enfant, puis sur la structure, enfin sur la vue relationnelle. Terminez votre planification DB là-bas. Il y avait une bonne réponse avant celle-ci sur la cascade, la restriction, etc. Bien sûr, cela pourrait être fait par des commandes ...

user2060451
la source
9

Clé étrangère signifie qu'un attribut non premier d'une table fait référence à l'attribut premier d'un autre * dans phpMyAdmin * définissez d'abord la colonne que vous souhaitez définir comme clé étrangère comme index

puis cliquez sur VUE RELATION

là, vous pouvez trouver les options pour définir la clé étrangère

Shafeeq M kunjumoideen
la source
7

InnoDB vous permet d'ajouter une nouvelle contrainte de clé étrangère à une table en utilisant ALTER TABLE:

ALTER TABLE tbl_name
    ADD [CONSTRAINT [symbol]] FOREIGN KEY
    [index_name] (index_col_name, ...)
    REFERENCES tbl_name (index_col_name,...)
    [ON DELETE reference_option]
    [ON UPDATE reference_option]

D'un autre côté, si MyISAM présente des avantages par rapport à InnoDB dans votre contexte, pourquoi voudriez-vous créer des contraintes de clé étrangère? Vous pouvez gérer cela au niveau du modèle de votre application. Assurez-vous simplement que les colonnes que vous souhaitez utiliser comme clés étrangères sont indexées!

Markus
la source
4
Les contraintes de clé étrangère me font économiser beaucoup d'efforts et d'erreurs potentielles. Par exemple, disons que je vais supprimer un utilisateur de mon système. Je pourrais écrire du code qui spécifie chaque endroit de la base de données où existent des données sur cet utilisateur, et lui dire de le supprimer. Mais je dois garder cette fonction de suppression à jour à tout moment. D'un autre côté, si toutes les données liées à l'utilisateur ont un FK pour l'ID de l'utilisateur et sont configurées en cascade lors de la suppression, tout mon code doit dire "supprimer cet utilisateur" et la base de données se chargera de supprimer tout ce qui a une référence FK à cet utilisateur. Beaucoup plus propre à entretenir.
Nathan Long
1
@Nathan: C'est ce que je dis dans le post. Vous pouvez également gérer cela au niveau du modèle. Vous pouvez implémenter la suppression en cascade du modèle.
Markus
3
Vous ajoutez presque toujours l'intégrité référentielle à vos tables de base de données. La base de données doit se protéger contre une mauvaise programmation d'application. Ne comptez pas uniquement sur votre application pour maintenir l'intégrité des données. Bien sûr, il y a toujours des exceptions à chaque règle, mais je n'en ai pas trouvé pour cela.
Harv
4

N'oubliez pas que les deux colonnes doivent avoir le même type de données.

par exemple, si une colonne est de type INT et l'autre de type tinyint, vous obtiendrez l'erreur suivante:

Erreur lors de la création de la clé étrangère sur [colonne PID] (vérifiez les types de données)

pouya
la source
3

Étape 1: Vous devez ajouter la ligne: default-storage-engine = InnoDB dans la section [mysqld] de votre fichier de configuration mysql (my.cnf ou my.ini selon votre système d'exploitation) et redémarrer le service mysqld. entrez la description de l'image ici

Étape 2: Maintenant, lorsque vous créez la table, vous verrez que le type de table est: InnoDB

entrez la description de l'image ici

Étape 3: Créez une table parent et enfant. Maintenant, ouvrez la table enfant et sélectionnez la colonne U comme pour avoir la clé étrangère: Sélectionnez la clé d'index dans le libellé d'action comme indiqué ci-dessous.

entrez la description de l'image ici

Étape 4: Ouvrez maintenant la vue des relations dans la même table enfant à partir du bas près de la vue d'impression, comme illustré ci-dessous.

entrez la description de l'image ici Étape 5: Sélectionnez la colonne U comme pour avoir la clé étrangère comme Sélectionnez la colonne parent dans le menu déroulant. dbName.TableName.ColumnName

Sélectionnez les valeurs appropriées pour ON DELETE et ON UPDATE entrez la description de l'image ici

Vinod
la source
2

Premier moteur de stockage défini comme InnoDB

Premier moteur de stockage défini comme InnoDB

puis l' option d' affichage des relations activer dans le menu de structure

puis l'option d'affichage de la relation permet

Sahil Ralkar
la source
votre première étape est correcte, mais qu'en est-il de la prochaine, veuillez écrire tout le processus étape par étape.
kunal shaktawat
2

C'est du vieux fil mais répondez car si utile à n'importe qui.

Étape 1 . Votre moteur de stockage Db défini sur InnoDB

Étape 2 . Créer une table principale

voici customerla table primaire et customer_idla clé primaire

entrez la description de l'image ici

Étape 3 . créer une table de clés étrangères et donner un index

ici, nous avons customer_addressescomme table associée et stockons les adresses des clients, alors voici la customer_idrelation avec la customertable

nous pouvons sélectionner l'index directement lors de la création du tableau comme ci-dessous

entrez la description de l'image ici

Si vous avez oublié de donner l'index lors de la création d'une table , vous pouvez donner l'index à partir de l' onglet de structure de la table comme ci-dessous.

entrez la description de l'image ici

Étape 4 . Une fois l'index donné au champ, allez dans l'onglet structure et cliquez sur la vue relationnelle comme indiqué dans l'image ci-dessous

entrez la description de l'image ici

Étape 5 . Maintenant, sélectionnez ON DELETE et ON UPDATE ce que vous voulez faire, sélectionnez la colonne de la table actuelle, sélectionnez DB (SAME DB), sélectionnez la table de relations et la clé primaire de cette table comme indiqué dans l'image ci-dessous et enregistrez -la

entrez la description de l'image ici

Vérifiez maintenant si la relation est réussie, accédez à la liste des données de la table étrangère et cliquez sur la valeur de la clé étrangère, vous redirigerez vers l'enregistrement de la table principale, puis la relation sera établie avec succès.

Devsi Odedra
la source
0

Dans la documentation officielle de MySQL à https://dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html :

MySQL nécessite des index sur les clés étrangères et les clés référencées afin que les vérifications de clés étrangères puissent être rapides et ne nécessitent pas une analyse de table.

Jaime Montoya
la source
0

Les versions plus récentes de phpMyAdmin n'ont plus l' option " Relation View ", auquel cas vous devrez exécuter une instruction pour obtenir la même chose. Par exemple

ALTER TABLE employees
    ADD CONSTRAINT fk_companyid FOREIGN KEY (companyid)
    REFERENCES companies (id)
    ON DELETE CASCADE;

Dans cet exemple, si une ligne des entreprises est supprimée, tous les employés avec cet ID d'entreprise sont également supprimés.

Vincent
la source