Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème de relations innoDB

    6 décembre 2010 à 9:11:48

    Bonjour à tous, j'ai essayer de me mettre au innoDB, mais là, je bloque. Voilà, j'ai une table trous et une autre stats. Je voudrais faire une relation entre le champs ID_trou de trous et ID_element de stats. Voilà l'erreur et le code: code :

    Erreur lors de la création de la clé étrangère sur ID_trou (vérifiez le type des colonnes)

    Erreur
    ALTER TABLE `trous` ADD FOREIGN KEY ( `ID_trou` ) REFERENCES `mabase`.`stats` ( `ID_element` ) ON DELETE CASCADE ON UPDATE CASCADE ;
    Déjà, c'est quoui une clé étrangère ? es-ce que si le champs stats.ID_element est défini comme clé primaire, ça peut bloquer ?
    Merci d'avance.
    • Partager sur Facebook
    • Partager sur Twitter
      6 décembre 2010 à 10:35:09

      Au contraire, ça arrive souvent qu'une clé étrangère aie pour référence la clé primaire d'une autre table. En gros, en ajoutant cette clé, tu mets comme contrainte à ta table trous, que tous les éléments de ID_trou existent dans la table stat en tant que ID_element.

      Ton erreur vient sans doute du fait que ID_trou n'est pas du même type que ID_element. Exactement du même type ! Donc si l'un est unsigned, l'autre doit l'être aussi. Si l'un est tinyint, l'autre ne peut pas être smallint, ...
      • Partager sur Facebook
      • Partager sur Twitter
        6 décembre 2010 à 10:44:59

        Tu avait raison, l'un était en INT et l'autre enn SMALLINT ....
        Mais c'est pas fini, maintenant ça m'affiche ça !
        Erreur

        requête SQL:

        ALTER TABLE `trous` ADD FOREIGN KEY ( `ID_trou` ) REFERENCES `mabase`.`stats` (
        `ID_element`
        ) ON DELETE CASCADE ON UPDATE CASCADE ;

        MySQL a répondu:Documentation
        #1452 - Cannot add or update a child row: a foreign key constraint fails (`mabase`.`#sql-17a4_5d`, CONSTRAINT `#sql-17a4_5d_ibfk_1` FOREIGN KEY (`ID_trou`) REFERENCES `stats` (`ID_element`) ON DELETE CASCADE ON UPDATE CASCADE)

        Merci encore.
        • Partager sur Facebook
        • Partager sur Twitter
          6 décembre 2010 à 10:46:17

          Y aurait-il des ID_trou n'existant pas dans ID_element ??
          • Partager sur Facebook
          • Partager sur Twitter
            6 décembre 2010 à 11:01:16

            Euh maintenant que j'y pense oui ... en fait, les stats sont uniques à l'utilisateur .... et si l'utilisateur n'a jamais fait le test en question, les stats n'existe pas ...
            Une solution ? :euh:
            Merci beaucoup.
            • Partager sur Facebook
            • Partager sur Twitter
              6 décembre 2010 à 11:07:41

              Ben, à mon avis, si je me souviens bien de ta base, tu devrais plutôt faire une clé étrangère sur ID_element qui fait référence à ID_trou. Ca me semble plus logique.
              • Partager sur Facebook
              • Partager sur Twitter
                6 décembre 2010 à 11:13:43

                en fait, c'est pour que quand je supprime un test, ça supprime tout ce qui appartient au test. Et dans la table trous, j'ai aussi un champs 'ID_test_parent', et c'est grâce à lui que je supprime les bonnes entrées .. et dans la table stats, je ne met pas l'ID du test_parent, ce serait beaucoup plus lourd !
                (pour te donner une idée, un test contient environ 100 trous (répertorier dans la table 'trous'). Et dans les stats, il y à un champ ID_element (l'ID du trou' et un champs ID_util. Donc ça fait environ nb_test * 100 * nb_membres ... Donc ça monte très vite à un nb d'entrées faramineux ... Donc j'évite d'alourdir en mettnat un champs ID_test_parent ...
                Voilà le problème...
                Merci encore.
                • Partager sur Facebook
                • Partager sur Twitter
                  6 décembre 2010 à 11:16:22

                  Donc faut bien mettre la clé étrangère sur ID_element vers ID_trou, comme ça, quand tu supprime un test, ça supprime les trous qui y font référence (il te faut alors une clé etrangère de ID_test dans trous vers ID dans test). Et quand tu supprimes des trous, tu supprimes des références de clés étrangères dans stats, et avec ON DELETE CASCADE, toutes les stat dont les références ont été supprimées vont être supprimées aussi.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    6 décembre 2010 à 11:51:26

                    Ah ! ça marche aussi !? Quand je supprime dans trous ça supprimeras dans stats ?!
                    Moui, je vais essayer ça tout de suite.
                    Merci beaucoup.
                    PS je peux pas faire ça maintenant, il faut que j'attende ce soir, désolé ...
                    A ce soir.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      6 décembre 2010 à 11:53:13

                      Ben oui, c'est ça le principe : quand les références sont supprimées, les lignes concernées font ce qui est défini par ON DELETE.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        6 décembre 2010 à 11:54:57

                        OK, simplement je pensais que ça marchais que dans un sens ! mais non, ça marche dans les deux, c'est ça que j'avais pas compris. Merci beaucoup.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          6 décembre 2010 à 12:01:46

                          Mmmm non, ça marche pas dans les deux hein !

                          Si tu supprimes des stats, ça supprimera pas de trous, mais si tu supprimes des trous, ça supprime des stats. Parce que les stat sont obligées de faire référence à un trou (à cause de la clé étrangère) donc si le trous auquel elles font référence disparait, elles doivent disparaitre. Par contre, les trous sont libres de faire ce qu'ils veulent, ils ne dépendent pas des stats.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            6 décembre 2010 à 12:03:56

                            Ben et alors, comme je peux pas supprimer directement les stats puisque je n'ai pas de champ ID_test_parents ... je suis obligé de supprimer depuis le champs trous, et non depuis le champs stats d'accord, j'ai compris ! :D
                            Merci bien.
                            Aïïïïïee !!! :colere::waw::'(

                            C'est tout mon site qui plante !!!!
                            Bon, ne nous affolons pas ! en fait ... c'est que comme j'aid éfini ID_element comme clé primaire, je ne peut pas mettre deux entrées avec le même ID_element !!! Et c'est indispensable, car il en faut pour chaque utilisateur ....
                            Bon, en attendant, je vire la clé primaire. (c'est que j'ai déjà des membres alors ... ^^
                            Merci bien.
                            Grrrrrrrr !!

                            MMM je n'arrive pas à supprimer ma clé primaire ... comment faire ?
                            Bon, j'ai trouvé,
                            c'est dans détails ... j'avais créé 11 clés primaires à force de bricoler !!!
                            • Partager sur Facebook
                            • Partager sur Twitter

                            Problème de relations innoDB

                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                            • Editeur
                            • Markdown