Question

Je crée une base de données en utilisant phpMyAdmin. J'ai deux tables ( toto et 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 champs id sont INT (11) .

Lorsque je choisis la table foo_bar , cliquez sur la vue " relation view " lien et essayez de définir les colonnes FK sur database.foo.id et database.bar.id , le message " Aucun index défini! " à côté de chaque colonne.

Qu'est-ce qui me manque?

Clarification / Mise à jour

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

De plus, bien que je n'ai pas encore été en mesure de configurer des 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.

Était-ce utile?

La solution

Si vous voulez utiliser phpMyAdmin pour configurer des relations, vous devez faire 2 choses. Tout d'abord, vous devez définir un index sur la colonne de clé étrangère de la table de référence (donc foo_bar.foo_id, dans votre cas). Ensuite, accédez à la vue relation (dans la table de référence) et sélectionnez la colonne référée (donc dans votre cas, foo.id), ainsi que 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 le moteur InnoDB est sélectionné dans les deux tables.

Autres conseils

phpMyAdmin vous permet de définir des clés étrangères en utilisant leurs "relations". vue. Mais depuis lors, MySQL ne supporte que les contraintes étrangères sur "INNO DB". tables, la première étape consiste à vérifier que les tables que vous utilisez sont de ce type.

Pour configurer une clé étrangère de sorte 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 tables, accédez à l'onglet Opérations et remplacez leur type par "INNO DB"
  2. .
  3. Assurez-vous que ID est la clé primaire (ou au moins une colonne indexée) de la table PARENT.
  4. Dans la table CHILD, définissez un index pour la colonne PID.
  5. Tout en affichant l'onglet Structure de la table CHILD, cliquez sur la vue "relation". lien juste au-dessus du champ "Ajouter des champs". section.
  6. Vous recevrez une table dans laquelle chaque ligne correspond à une colonne indexée dans votre table CLIENT. La première liste déroulante de chaque ligne vous permet de choisir le type de colonne auquel la colonne indexée fait référence. Dans la ligne correspondant au PID, choisissez PARENT-> ID dans la liste déroulante, puis cliquez sur OK.

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

Ceci est un résumé d'un article de Wikipedia. Il spécifie 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 est trop volumineux pour un commentaire - espérons que cela aidera.

CASCADE

Chaque fois que des lignes de la table maître (référencée) sont supprimées (ou mises à jour), les lignes respectives de la table enfant (référençant) avec une colonne de clé étrangère correspondante sont également supprimées (ou mises à jour). Ceci s'appelle une suppression en cascade (resp. Update [2]).

RESTRICT

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

AUCUNE ACTION

NO ACTION et RESTRICT sont très semblables. La principale différence entre NO ACTION et RESTRICT est que, avec NO ACTION, le contrôle d'intégrité référentielle est effectué 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 ont le même effet si le contrôle 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 sont nullables. En raison de la sémantique de NULL, une ligne de référence avec des valeurs NULL dans les colonnes de clé étrangère ne nécessite pas de ligne référencée.

SET DEFAULT

Semblables à SET NULL, les valeurs de clé étrangère de 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.

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

 entrez la description de l'image ici

Vous pouvez attribuer la clé de forgeage à partir de la liste située près de la clé primaire (voir image ci-dessous). et enregistrez

 entrez la description de l'image ici

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

Pour ceux qui débutent dans la base de données .... et qui 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, consultez ceci .

  1. Assurez-vous d'avoir P_ID (ID parent sur les tables parent et enfant).
  2. Bien sûr, il sera déjà renseigné dans le parent. Pas nécessairement chez l'enfant de manière vraie et définitive. Ainsi, par exemple, P_ID n ° 3 (plusieurs fois dans la table enfant indiqueront peut-être le P_ID d'origine dans la table parente).
  3. Allez sur l'onglet SQL (j'utilise phpMyAdmin, il devrait être semblable aux autres) et faites 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 et enfin sur la vue relationnelle. Terminez la planification de votre base de données là-bas. Il y avait une bonne réponse avant celle-ci à propos de cascade, restrict, etc. Bien sûr, cela pourrait être fait avec des commandes ...

Une clé étrangère signifie qu'un attribut non premier d'une table fait référence à l'attribut premier d'un autre * dans phpMyAdmin * commencez par définir la colonne pour laquelle vous souhaitez définir la clé étrangère comme index

puis cliquez sur RELATION VIEW

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

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 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 voulez utiliser comme clés étrangères sont indexées!

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 la [colonne PID] (vérification des types de données)

É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émarrez le service mysqld. entrer la description de l'image ici

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

 entrer la description de l'image ici

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

 entrer la description de l'image ici

Étape 4: Ouvrez maintenant la vue des relations dans la même table enfant du bas près de la vue Imprimer, comme indiqué ci-dessous.

 entrer la description de l'image ici Étape 5: Sélectionnez la colonne U pour que la clé étrangère soit sélectionnée. 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. entrer la description de l'image ici

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

  

MySQL requiert des index sur les clés étrangères et les clés référencées pour que   Les vérifications de clés étrangères peuvent être rapides et ne nécessitent pas d'analyse de table.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top