Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Débuter
Débuter Forum d'entraide pour débuter avec MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 04/08/2006, 10h06   #1
Membre chevronné
 
Inscription : janvier 2006
Messages : 917
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 917
Points : 733
Points : 733
Par défaut [clés étrangères] a foreign key constraint fails

Bonjour

Je débute complètement dans l'utilisation des clés étrangères sous MySQL. J'ai déjà configuré des liaisons entre tables avec Access, mais c'est pas aussi simple.
J'ai 2 tables auth_droits (qui contient la liste des droits d'accès) et auth_profils (qui contient la liste des profils). Le lien doit se faire sur le champ nom_droit, qui est clé primaire de auth_droits (chaque droit est unique) et index simple de auth_profils (chaque profil peut avoir plusieurs droits).

J'ai défini la liaison avec l'interface de phpmyadmin, mais lorsque j'essaye de modifier un des droits dans la table principale avec
Code :
UPDATE `auth_droits` SET `nom_droit` = 'droit21' WHERE CONVERT( `nom_droit` USING utf8 ) = 'droit2' LIMIT 1
j'ai le message suivant
Code :
#1452 - Cannot add or update a child row: a foreign key constraint fails (`middle/auth_droits`, CONSTRAINT `auth_droits_ibfk_1` FOREIGN KEY (`nom_droit`) REFERENCES `auth_profils` (`nom_droit`) ON DELETE CASCADE ON UPDATE CASCADE)
Est-ce un problème d'installation de l'InnoDB, ou autre chose ?
Merci d'avance pour votre aide.
guidav est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2006, 10h08   #2
Membre habitué
 
Avatar de Regnak
 
Étudiant
Inscription : juillet 2006
Messages : 130
Détails du profil
Informations personnelles :
Âge : 23

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2006
Messages : 130
Points : 144
Points : 144
C'est normale, car la contrainte de clé étrangère permet de lier deux champs INTEGRALEMENt, donc il est impossible de le modifier sans rompre le lien de clé etragère
__________________


Regnak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2006, 10h31   #3
Membre chevronné
 
Inscription : janvier 2006
Messages : 917
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 917
Points : 733
Points : 733
Citation:
Envoyé par Regnak
C'est normale, car la contrainte de clé étrangère permet de lier deux champs INTEGRALEMENt, donc il est impossible de le modifier sans rompre le lien de clé etragère
Je ne vois pas où est le problème : je veux juste changer le contenu du champ, pas son nom ni sa nature.
Si j'ai bien compris, l'interêt des clés étrangères est bien de propager une modification d'une table à l'autre, non ?
guidav est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2006, 10h36   #4
Membre régulier
 
Avatar de jp_rennes
 
Inscription : mars 2006
Messages : 72
Détails du profil
Informations personnelles :
Âge : 39
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : mars 2006
Messages : 72
Points : 83
Points : 83
ton champ nom_droit doit être une cle etrangère referancant un champ d'une autre table.
DOnc tu ne peux mettre comme valeur de ce champ qu'une valeur qui existe dans le champ de la table référencée.
fait un show create table <nom de ta table> et tu verras quelle table et quel champ de cette table est référencé.
jp_rennes est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2006, 10h45   #5
Membre chevronné
 
Inscription : janvier 2006
Messages : 917
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 917
Points : 733
Points : 733
Citation:
Envoyé par jp_rennes
ton champ nom_droit doit être une cle etrangère referancant un champ d'une autre table.
C'est bien le cas : nom_droit est dans les les 2 tables
Citation:
Envoyé par jp_rennes
DOnc tu ne peux mettre comme valeur de ce champ qu'une valeur qui existe dans le champ de la table référencée.
J'ai bien la relation
Code :
1
2
TABLE: auth_droits "InnoDB free: 4096 kB; (`nom_droit`) REFER `middle/auth_profils`(`nom_droit`) ON "  
avec ON DELETE CASCADE ON UPDATE CASCADE
Selon ce schéma, si je modifie le champ nom_droit dans auth_droits, ca doit se propager dans auth_profils ?
Désolé pour ces questions de débutant, mais je suis un peu perdu.
guidav est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2006, 11h04   #6
Provisoirement toléré
 
Avatar de Maximilian
 
Inscription : juin 2003
Messages : 2 622
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 2 622
Points : 2 505
Points : 2 505
Citation:
Envoyé par guidav
C'est bien le cas : nom_droit est dans les les 2 tables
Tu es sûr d'avoir exactement la clé 'droit21' dans auth_profils ?

(au passage, une clé primaire numérique serait plus efficace, cf http://sqlpro.developpez.com/cours/m...ge=base#L2.5.1 )
__________________
Pensez au bouton
Maximilian est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2006, 11h09   #7
Membre chevronné
 
Inscription : janvier 2006
Messages : 917
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 917
Points : 733
Points : 733
Citation:
Envoyé par Maximilian
Tu es sûr d'avoir exactement la clé 'droit21' dans auth_profils ?

(au passage, une clé primaire numérique serait plus efficace, cf http://sqlpro.developpez.com/cours/m...ge=base#L2.5.1 )
Non, je ne l'ai pas, mais ca veut dire qu'il est impossible de faire une mise à jour sur un index qui sert de clé étrangère ?
Je crois que j'ai besoin d'un peu de théorie sur le sujet, je vais me plonger dedans.
guidav est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2006, 11h15   #8
Provisoirement toléré
 
Avatar de Maximilian
 
Inscription : juin 2003
Messages : 2 622
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 2 622
Points : 2 505
Points : 2 505
Le but principal d'une contrainte de clé étrangère est d'assurer l'intégrité référentielle, c'est à dire de vérifier que chaque ligne de la table enfant ait une correspondance dans la table parent.

En l'occurrence le droit 'droit21' n'existe pas dans la table de référence auth_profils donc impossible d'attribuer ce droit dans une ligne de la table auth_droits.

Citation:
InnoDB rejects any INSERT or UPDATE operation that attempts to create a foreign key value in a child table if there is no a matching candidate key value in the parent table.
http://dev.mysql.com/doc/refman/5.0/...nstraints.html
__________________
Pensez au bouton
Maximilian est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2006, 11h59   #9
Membre chevronné
 
Inscription : janvier 2006
Messages : 917
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 917
Points : 733
Points : 733
Je crois que j'ai compris, mais à quoi servent donc les propriétés ON DELETE CASCADE et surtout ON UPDATE CASCADE ?
guidav est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2006, 14h35   #10
Provisoirement toléré
 
Avatar de Maximilian
 
Inscription : juin 2003
Messages : 2 622
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 2 622
Points : 2 505
Points : 2 505
ON DELETE CASCADE : la suppression d'une ligne de la table parent entraine une suppression de toutes les lignes la référençant dans la table enfant.

ON UPDATE : pareil avec la modification
__________________
Pensez au bouton
Maximilian est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2006, 15h04   #11
Membre chevronné
 
Inscription : janvier 2006
Messages : 917
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 917
Points : 733
Points : 733
Citation:
Envoyé par Maximilian
ON DELETE CASCADE : la suppression d'une ligne de la table parent entraine une suppression de toutes les lignes la référençant dans la table enfant.

ON UPDATE : pareil avec la modification
C'est bien ce que je pensais, donc pourquoi la modification de "droit2" en "droit21" dans la table parent (auth_droits) induit-elle une erreur ? Elle devrait plutôt entraîner la modification de "droit2" en "droit21" dans la table enfant (auth_profils).
D'où mon interrogation sur l'erreur
guidav est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2006, 15h19   #12
Provisoirement toléré
 
Avatar de Maximilian
 
Inscription : juin 2003
Messages : 2 622
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 2 622
Points : 2 505
Points : 2 505
Citation:
Envoyé par guidav
FOREIGN KEY (`nom_droit`) REFERENCES `auth_profils` (`nom_droit`) ON DELETE CASCADE ON UPDATE CASCADE)
auth_droits.nom_droit fait référence à auth_profils.nom_droit : tel que tu as écrit ta contrainte, c'est donc auth_droits la table enfant et auth_profils la table parent.
__________________
Pensez au bouton
Maximilian est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2006, 15h28   #13
Membre chevronné
 
Inscription : janvier 2006
Messages : 917
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 917
Points : 733
Points : 733
C'était donc ça... Comme quoi, une erreur de débutant, et on va vite chercher midi à quatorze heure.
Merci à tous, particulièrement maximilan.

Question subsidiaire : comment faire pour créer la relation inverse, sachant que phpmyadmin refuse de le faire ?
guidav est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2006, 15h32   #14
Provisoirement toléré
 
Avatar de Maximilian
 
Inscription : juin 2003
Messages : 2 622
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 2 622
Points : 2 505
Points : 2 505
La relation inverse... c'est à dire ?
__________________
Pensez au bouton
Maximilian est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2006, 16h07   #15
Membre chevronné
 
Inscription : janvier 2006
Messages : 917
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 917
Points : 733
Points : 733
Citation:
Envoyé par Maximilian
La relation inverse... c'est à dire ?
Faire de auth_droits la table parent et de auth_profil la table enfant. Est-il nécessaire de définir la relation dans les 2 sens ?
guidav est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/08/2006, 23h50   #16
Provisoirement toléré
 
Avatar de Maximilian
 
Inscription : juin 2003
Messages : 2 622
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 2 622
Points : 2 505
Points : 2 505
Non, c'est uniquement au niveau de la table fille qu'il faut mettre la contrainte de clé étrangère.
__________________
Pensez au bouton
Maximilian est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h00.


 
 
 
 
Partenaires

Hébergement Web