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

Je configure une base de données en utilisant phpMyAdmin. J'ai deux tables (foo et bar), indexée 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 supporte pas les clés étrangères. Tous les champs id sont INT(11).

Lorsque je choisis la table foo_bar, Cliquez sur le lien "vue relation", et essayez de définissez les colonnes FK sur database.foo.id et database.bar.id, Il est dit " aucun index défini!" à côté de chaque colonne.

Qu'est-ce que je manque?

Clarification / Mise À Jour

Par souci de simplicité, je veux 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, bien que je n'aie 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 rend mal à l'aise de ne pas avoir les FK explicitement définis dans la base de données.

282
demandé sur Nathan Long 2009-01-20 00:48:10

9 réponses

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 dans la table de référence (so 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 court si vous définissez les options de référencement correctement.

EDIT: assurez-vous que le moteur InnoDB est sélectionné dans les deux tables.

316
répondu rael_kid 2017-02-22 18:57:49

PhpMyAdmin vous permet de définir des clés étrangères en utilisant leur vue "relations". Mais puisque MySQL ne supporte 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 de sorte que la colonne PID dans une table nommée CHILD référence la colonne ID dans une table nommée PARENT, vous pouvez effectuer les opérations suivantes:

  1. pour les deux tables, allez dans l'onglet 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 enfant, définissez un index pour la colonne PID.
  4. lors de l'affichage de l'onglet 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 la TABLE->colonne référencée par la colonne indexée. Dans la ligne pour PID, choisissez PARENT - > ID dans la liste déroulante et cliquez sur GO.

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

205
répondu awais 2012-06-26 12:10:15

Ceci est un résumé d'un article de Wikipédia. 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 "on update/delete" 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 . mise à jour), les lignes respectives de la table enfant (référencement) avec une correspondance étrangère la colonne clé sera supprimée (resp. mis à jour) ainsi. 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é étrangère qui fait référence à la valeur de la table référencée. De même, une ligne ne peut pas être supprimée tant qu'il y a une référence à partir d'une table de clé étrangère.

AUCUNE ACTION

Aucune ACTION et restriction ne se ressemblent beaucoup. La principale différence entre aucune ACTION et RESTRICT est que, sans 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înera une erreur.

DÉFINIR NULL

Les valeurs de clé étrangère dans la ligne de référencement 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érencement avec des valeurs Null dans les colonnes de clé étrangère ne nécessite pas de ligne référencée.

DÉFINIR PAR DÉFAUT

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

74
répondu Brett 2012-08-10 01:45:30

Dans phpmyadmin, vous pouvez attribuer une clé étrangère simplement par son interface graphique. Cliquez sur le tableau et allez à L'onglet Structure. trouvez la vue de la Relation sur juste ci-dessous de la table (montré dans l'image ci-dessous).

entrez la description de l'image ici

Vous pouvez attribuer la clé de forgeage à partir de la zone de liste à proximité 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.

50
répondu Nishad Up 2016-05-10 09:28:28

Pour ceux qui sont nouveaux dans la base de données .... et besoin de modifier une table existante. Beaucoup de choses semblent être assez simples, mais il y a toujours quelque chose ... entre A et B.

Avant toute chose, jetez un oeil à CE .

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

    Modifier la TABLE child_table_name
    AJOUTER UNE CLÉ ÉTRANGÈRE (P_ID)
    Références parent_table_name (P_ID)

  4. Cliquez sur la table d'enfant, que la structure, enfin sur la vue relationnelle. Terminez votre planification DB là. Il y avait une bonne réponse avant celle-ci à propos de cascade, restrict, etc. Bien sûr cela pourrait être fait par commande...

11
répondu user2060451 2013-09-12 05:06:05

clé étrangère signifie 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 en tant qu'index

Puis cliquez sur Vue RELATION

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

9
répondu Shafeeq M kunjumoideen 2013-11-25 10:56:07

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 a des avantages sur 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 que les colonnes que vous souhaitez utiliser comme clés étrangères sont indexés!

7
répondu markus 2009-01-21 09:07:57

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 est de type tinyint vous obtiendrez l'erreur suivante:

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

4
répondu pouya 2011-12-14 18:08:42

Étape 1: Vous devez ajouter la ligne: par défaut-storage-engine = InnoDB sous la section [mysqld] de votre fichier de configuration mysql (my.cnf ou mon.ini en fonction de votre système D'exploitation) et redémarrez le service mysqld. entrez la description de l'image ici

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

entrez la description de l'image ici

Étape 3: Créez une table Parent et une table 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 Étiquette d'Action comme indiqué ci-dessous.

entrez la description de l'image ici

Étape 4: Ouvrez maintenant la vue Relation dans la même table enfant à partir du bas près de la vue D'impression comme indiqué 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 la liste déroulante. dbName.TableName.ColumnName

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

2
répondu Vinod 2017-09-07 21:07:59