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

Je configure une firebase database 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 eux, en utilisant leurs clés primaires comme clés étrangères.

J’ai créé ces tables en tant que MyISAM, mais depuis j’ai changé les trois pour InnoDB, car je lis que MyISAM ne supporte pas les clés étrangères. Tous les champs d’ id sont INT(11) .

Lorsque je choisis la table foo_bar , cliquez sur le lien “vue relationnelle” et essayez de définir les colonnes FK comme étant database.foo.id et database.bar.id , il est dit “Aucun index défini!” à côté de chaque colonne.

Qu’est-ce que je rate?

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 fourni avec phpMyAdmin.

De plus, même si je n’ai pas encore pu configurer de clé étrangère explicite, 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 firebase database.

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 (donc foo_bar.foo_id, dans votre cas). Ensuite, allez dans la vue de la 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 plusieurs tables sont 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é pour les deux tables.

phpMyAdmin vous permet de définir des clés étrangères en utilisant leur vue “relations”. Mais depuis, MySQL ne supporte que les contraintes étrangères 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 effectuer les opérations suivantes:

  1. Pour les deux tables, accédez à l’onglet Opérations et modifiez 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. En consultant l’onglet Structure de la table ENFANT, cliquez sur le lien “Vue relationnelle” 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-> COLUMN les références de la colonne indexée. Dans la ligne du PID, choisissez PARENT-> ID dans le menu déroulant 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.

Ceci est un résumé d’un article de Wikipedia. Il spécifie les différents types de relations que vous pouvez définir dans PHPmyadmin. Je le mets ici car il est pertinent pour le commentaire de @ Nathan sur la définition des options des clés étrangères pour “on update / delete” mais est trop grand pour un commentaire – j’espère que cela vous aidera.

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 (faisant référence) 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. Update [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 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 ya une référence à une table de clé étrangère.

PAS D’ACTION

AUCUNE ACTION et RESTRICT ne se ressemblent beaucoup. La principale différence entre NO ACTION et RESTRICT est que, sans action, la vérification de l’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 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.

SET NUL

Les valeurs de clé étrangère dans la ligne faisant référence sont définies sur NULL lorsque la ligne référencée est mise à jour ou supprimée. Ceci 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 référençant NULL dans les colonnes de la clé étrangère ne nécessite pas de ligne référencée.

DÉFINIR PAR DEFAUT

Semblable à SET NULL, les valeurs de clé étrangère dans la ligne faisant 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.

Dans phpmyadmin, vous pouvez affecter une clé étrangère simplement par son interface graphique. Cliquez sur la table et allez dans l’onglet Structure. Trouvez la vue des relations sur le tableau ci-dessous (voir l’image ci-dessous).

entrer la description de l'image ici

Vous pouvez affecter la clé de forgeage à partir de la zone de liste près de la clé primaire (voir image ci-dessous). Et enregistrer

entrer la description de l'image ici

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

Pour ceux qui découvrent la firebase database …. 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, regardez ceci .

  1. Assurez-vous d’avoir le P_ID (ID parent sur la table parent et la table 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. Ainsi, par exemple, P_ID # 3 (plusieurs fois dans la table enfant pointeront peut-être vers le P_ID original de la table parent).
  3. Allez dans l’onglet SQL (j’utilise phpMyAdmin, devrait être similaire dans d’autres) et faites cette commande:

    ALTER TABLE nom_table_enfant
    AJOUTEZ LA TOUCHE ÉTRANGÈRE (P_ID)
    Références parent_table_name (P_ID)

  4. Cliquez sur la table enfant, 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, restreindre, etc. Bien sûr, cela pourrait être fait par des commandes …

La clé étrangère signifie qu’un atsortingbut non premier d’une table renvoie l’atsortingbut principal d’un autre * dans phpMyAdmin *. Définissez d’ abord la colonne que vous voulez 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

InnoDB vous permet d’append 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 obtenez l’erreur suivante:

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

Étape 1: Vous devez append 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. entrer la description de l'image ici

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

entrer la description de l'image ici

Étape 3: Créez les deux tables Parent et Child. Ouvrez maintenant la table Child et sélectionnez la colonne U comme si vous aviez 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 depuis le bas près de la vue d’impression, comme indiqué ci-dessous.

entrer la description de l'image ici Étape 5: Sélectionnez la colonne U comme si vous aviez la clé étrangère en tant que Sélectionnez la colonne Parent dans le menu déroulant. NomDb.NomTable.NomColonne

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