352 votes

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

Je suis en train de mettre en place une base de données à l'aide de phpMyAdmin. J'ai deux tables ( foo y bar ), indexés 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. Toutes id Les champs sont INT(11) .

Lorsque je choisis le foo_bar cliquez sur le lien "vue des relations" et essayez de définir les colonnes FK comme étant database.foo.id y database.bar.id il est dit "Aucun indice défini !" à côté de chaque colonne.

Qu'est-ce que je rate ?

Clarification/Mise à jour

Pour des raisons de simplicité, je veux continuer à utiliser phpMyAdmin. J'utilise actuellement XAMPP, qui est assez simple pour me permettre de me concentrer sur le PHP/CSS/Javascript, et qui est livré avec phpMyAdmin.

De plus, bien que je n'aie pas encore été en mesure de mettre en place des clés étrangères explicites, je dispose d'une table relationnelle et je peux effectuer des jointures comme celle-ci :

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 avoir les FKs explicitement définis dans la base de données.

379voto

Lex Points 5801

Si vous voulez utiliser phpMyAdmin pour configurer les relations, vous devez faire deux choses. Tout d'abord, vous devez définir un index sur la colonne de la 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 la table 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 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é.

97 votes

Astuce : La vue des relations est un petit lien sous votre table, c'était difficile pour moi de le trouver en premier lieu.

15 votes

À moins que ce lien ne soit pas affiché, auquel cas : Assurez-vous que votre table est de type InnoDB (sous l'onglet Opérations dans phpMyAdmin) pour que cela ne se produise pas.

4 votes

@muttley91Ma table est InnoDB. J'ai vérifié deux fois. Le lien ne s'affiche toujours pas.

232voto

awais Points 971

PhpMyAdmin vous permet de définir des clés étrangères en utilisant la vue "relations". Mais comme MySQL ne supporte les contraintes étrangères que sur les tables "INNO DB", la première étape est de 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 procéder comme suit :

  1. Pour les deux tables, allez dans l'onglet des opérations et changez leur type en "INNO DB".
  2. Assurez-vous que 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. En visualisant l'onglet structure de la table ENFANT, cliquez sur le lien "vue de la relation" juste au-dessus de la section "ajouter des champs".
  5. Vous recevrez un tableau dont chaque ligne correspond à une colonne indexée dans votre table CLIENT. La première liste déroulante de chaque ligne vous permet de choisir la TABLE->COLONNE à laquelle la colonne indexée fait référence. 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.

2 votes

Wow, une chose très importante à savoir. Cette page n'est pas la première chose que j'ai trouvée lorsque j'ai cherché de l'aide pour ajouter une clé étrangère, j'aimerais que cela soit mentionné plus souvent.

93voto

Brett Points 857

Il s'agit d'un résumé d'un article de Wikipedia. Il précise les différents types de relations que vous pouvez stipuler dans PHPmyadmin. Je le mets ici car il est pertinent pour le commentaire de @Nathan sur la définition des options de clés étrangères pour "on update/delete" mais il est trop volumineux pour un commentaire - j'espère qu'il vous aidera.

CASCADE

Lorsque des lignes de la table maître (référencée) sont supprimées (resp. mises à jour), les lignes respectives de la table enfant (référencée) avec une colonne de clé étrangère correspondante seront également supprimées (resp. mises à jour). C'est ce qu'on appelle une suppression (resp. une mise à jour) en cascade[2].

RESTRICT

Une valeur ne peut pas être mise à jour ou supprimée lorsqu'il existe une ligne dans une table à clé étrangère 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'il existe une référence à cette ligne dans une table à clé étrangère.

PAS D'ACTION

NON-ACTION et RESTRICTION se ressemblent beaucoup. La principale différence entre NO ACTION et RESTRICT est qu'avec NO ACTION, la vérification de l'intégrité référentielle est effectuée après avoir essayé 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 la même manière si la vérification de l'intégrité référentielle échoue : l'instruction UPDATE ou DELETE entraîne une erreur.

SET NULL

Les valeurs de la clé étrangère dans la ligne de référence sont mises à 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érencement peuvent être mises à zéro. En raison de la sémantique de NULL, une ligne de référencement avec des NULL dans les colonnes de clé étrangère ne nécessite pas de ligne référencée.

SET DEFAULT

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

1 votes

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

10voto

Une clé étrangère signifie qu'un attribut non primaire d'une table fait référence à l'attribut primaire d'une autre table. * dans phpMyAdmin * Définissez d'abord la colonne dans laquelle vous voulez définir la clé étrangère comme un index.

puis cliquez sur VUE DES RELATIONS

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

8voto

markus Points 22871

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'autre part, si MyISAM présente des avantages par rapport à InnoDB dans votre contexte, pourquoi vouloir 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 !

4 votes

Les contraintes liées aux clés étrangères m'épargnent beaucoup d'efforts et d'erreurs potentielles. Par exemple, disons que je vais supprimer un utilisateur de mon système. Je pourrais écrire un code qui spécifie chaque endroit de la base de données où des données sur cet utilisateur existent, et lui demander de les supprimer. Mais je dois maintenir cette fonction de suppression à jour à tout moment. D'un autre côté, si toutes les données liées à l'utilisateur ont un FK sur l'ID de l'utilisateur et sont configurées pour être mises en cascade lors de la suppression, tout ce que mon code doit dire est "supprimer cet utilisateur" et la base de données se chargera de supprimer tout ce qui a une référence FK à cet utilisateur. C'est beaucoup plus simple à gérer.

1 votes

@Nathan : C'est ce que je dis dans le post. Vous pouvez aussi gérer cela au niveau du modèle. Vous pouvez mettre en œuvre une cascade de suppression à partir du modèle.

3 votes

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 de la mauvaise programmation des applications. 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é.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X