Je suis en train de mettre en place une base de données en utilisant phpMyAdmin. J'ai deux tables (foo
et bar
), indexées sur leurs clés primaires. J'essaie de créer une table relationnelle (foo_bar
) entre elles, 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 supporte pas les clés étrangères. Tous les champs id
sont des INT(11)
.
Lorsque je sélectionne la table "foo_bar", que je clique sur le lien "Vue des relations" et que j'essaie de définir les colonnes FK comme étant "base de données.foo.id" et "base de données.bar.id", le message suivant apparaît à côté de chaque colonne : "Aucun index défini".
Qu'est-ce que j'ai raté ?
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 configurer 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;
Le fait que les clés étrangères ne soient pas explicitement définies dans la base de données me met mal à l'aise.
Si vous voulez utiliser phpMyAdmin pour établir des 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 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é.
phpMyAdmin vous permet de définir des clés étrangères à l'aide de leur vue "relations" ;. Mais comme MySQL ne prend en charge les contraintes étrangères que 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 procéder comme suit :
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.
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 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 !