IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 MySQL Discussion :

[clés étrangères] a foreign key constraint fails


Sujet :

MySQL

  1. #1
    Membre éprouvé

    Inscrit en
    Janvier 2006
    Messages
    969
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 969
    Points : 958
    Points
    958
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE `auth_droits` SET `nom_droit` = 'droit21' WHERE CONVERT( `nom_droit` USING utf8 ) = 'droit2' LIMIT 1
    j'ai le message suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #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.

  2. #2
    Membre habitué
    Avatar de Regnak
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2006
    Messages
    130
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2006
    Messages : 130
    Points : 165
    Points
    165
    Par défaut
    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

  3. #3
    Membre éprouvé

    Inscrit en
    Janvier 2006
    Messages
    969
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 969
    Points : 958
    Points
    958
    Par défaut
    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 ?

  4. #4
    Membre régulier Avatar de jp_rennes
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    72
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mars 2006
    Messages : 72
    Points : 86
    Points
    86
    Par défaut
    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é.

  5. #5
    Membre éprouvé

    Inscrit en
    Janvier 2006
    Messages
    969
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 969
    Points : 958
    Points
    958
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  6. #6
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    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 )

  7. #7
    Membre éprouvé

    Inscrit en
    Janvier 2006
    Messages
    969
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 969
    Points : 958
    Points
    958
    Par défaut
    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.

  8. #8
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    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.

    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

  9. #9
    Membre éprouvé

    Inscrit en
    Janvier 2006
    Messages
    969
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 969
    Points : 958
    Points
    958
    Par défaut
    Je crois que j'ai compris, mais à quoi servent donc les propriétés ON DELETE CASCADE et surtout ON UPDATE CASCADE ?

  10. #10
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    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

  11. #11
    Membre éprouvé

    Inscrit en
    Janvier 2006
    Messages
    969
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 969
    Points : 958
    Points
    958
    Par défaut
    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

  12. #12
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    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.

  13. #13
    Membre éprouvé

    Inscrit en
    Janvier 2006
    Messages
    969
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 969
    Points : 958
    Points
    958
    Par défaut
    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 ?

  14. #14
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    La relation inverse... c'est à dire ?

  15. #15
    Membre éprouvé

    Inscrit en
    Janvier 2006
    Messages
    969
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 969
    Points : 958
    Points
    958
    Par défaut
    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 ?

  16. #16
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    Non, c'est uniquement au niveau de la table fille qu'il faut mettre la contrainte de clé étrangère.

Discussions similaires

  1. Une erreur 233 de ms sql server
    Par Hokage dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 05/10/2009, 18h40
  2. Erreur 233 sous sql server
    Par brajae85 dans le forum Oracle
    Réponses: 3
    Dernier message: 18/05/2009, 17h12
  3. Réponses: 2
    Dernier message: 05/10/2004, 23h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo