Partage
  • Partager sur Facebook
  • Partager sur Twitter

Erreur Ajout d'une relation à plusieurs

[MySQL 8.0] - cours "Implémentez vos bases de données relationnelles"

Sujet résolu
    11 mai 2022 à 17:12:49

    Bonjour,

    dans la quatrième partie du cours ("Modifiez le format de vos données selon les évolutions de votre application"), au deuxième niveau ("Ajoutez une relation un à plusieurs"), j'ai un problème. 

    Au moment d'ajouter une "Foreign key", j'ai ce message d'erreur : 

    ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`foodly`.`#sql-5d7_a`, CONSTRAINT `aliment_ibfk_1` FOREIGN KEY (`reduction_id`) REFERENCES `reduction` (`id`) ON DELETE SET NULL)


    Or, je ne comprends pas ce qui cloche. Pour info, voici un aperçu de mes tables "aliment" et "reduction" :

    mysql> SHOW TABLES;
    +----------------------------+
    | Tables_in_foodly           |
    +----------------------------+
    | aliment                    |
    | alimentsnonbios_parprot_vw |
    | famille                    |
    | langue                     |
    | reduction                  |
    | utilisateur                |
    | utilisateur_aliment        |
    | utilisateurs_gmail_vw      |
    +----------------------------+
    8 rows in set (0,19 sec)
    
    mysql> SHOW COLUMNS FROM aliment;
    +--------------+--------------+------+-----+---------+----------------+
    | Field        | Type         | Null | Key | Default | Extra          |
    +--------------+--------------+------+-----+---------+----------------+
    | id           | int          | NO   | PRI | NULL    | auto_increment |
    | nom          | varchar(100) | NO   |     | NULL    |                |
    | marque       | varchar(100) | YES  |     | NULL    |                |
    | sucre        | float        | YES  |     | NULL    |                |
    | calories     | float        | YES  |     | NULL    |                |
    | graisses     | float        | YES  |     | NULL    |                |
    | proteines    | float        | YES  |     | NULL    |                |
    | vitamines_c  | float        | YES  |     | NULL    |                |
    | famille_id   | int          | NO   |     | NULL    |                |
    | reduction_id | int          | YES  |     | NULL    |                |
    +--------------+--------------+------+-----+---------+----------------+
    10 rows in set (0,04 sec)
    
    mysql> SELECT * FROM aliment;
    +----+------------------+-------------+-------+----------+----------+-----------+-------------+------------+--------------+
    | id | nom              | marque      | sucre | calories | graisses | proteines | vitamines_c | famille_id | reduction_id |
    +----+------------------+-------------+-------+----------+----------+-----------+-------------+------------+--------------+
    |  1 | pomme            | sans marque |  19.1 |       72 |      0.2 |       0.4 |        NULL |          2 |            1 |
    |  2 | poire            | sans marque |  27.5 |      134 |      0.2 |       1.1 |        NULL |          2 |            0 |
    |  3 | banane           | chiquita    |    24 |      101 |      0.3 |       1.1 |        NULL |          2 |            0 |
    |  4 | jambon           | herta       |   0.2 |       34 |      0.8 |       6.6 |        NULL |          0 |            0 |
    |  5 | compote          | andros      |    11 |       51 |        0 |       0.5 |        NULL |          2 |            0 |
    |  6 | steak haché      | charal      |   0.8 |       68 |      4.8 |       4.8 |        NULL |          0 |            0 |
    |  7 | saumon           | guyader     |     0 |      206 |     12.3 |      22.1 |        NULL |          0 |            0 |
    |  8 | haricots verts   | bonduelle   |   5.8 |       25 |      0.1 |       1.5 |        NULL |          1 |            0 |
    |  9 | riz              | oncle benz  |  28.2 |      130 |      0.3 |       2.7 |        NULL |          0 |            0 |
    | 10 | pâtes completes  | barilla     |    64 |      353 |      2.7 |        14 |        NULL |          0 |            0 |
    | 11 | blanc de dinde   | père dodu   |   0.6 |       98 |      0.9 |        22 |        NULL |          0 |            0 |
    | 12 | filet de poulet  | le gaulois  |     0 |      121 |      1.8 |      26.2 |        NULL |          0 |            0 |
    | 13 | muesli           | bjorg       |  26.5 |      170 |        5 |       3.5 |        NULL |          0 |            0 |
    | 14 | café             | carte noire |     0 |        0 |        0 |         0 |        NULL |          0 |            0 |
    | 15 | jus d'orange     | innocent    |    16 |       74 |        0 |       1.6 |        NULL |          2 |            0 |
    | 16 | jus de pomme     | andros      |    24 |      100 |      0.2 |       0.2 |        NULL |          2 |            0 |
    | 17 | pomme de terre   | doréac      |  21.1 |      104 |      0.2 |       2.8 |        NULL |          0 |            0 |
    | 18 | oeuf             | naturalia   |   0.4 |       74 |      5.1 |       6.5 |        NULL |          0 |            0 |
    | 19 | baguette         | sans marque |  36.1 |      185 |      1.2 |       7.5 |        NULL |          0 |            0 |
    | 20 | lait d'amande    | bjorg       |   6.1 |       80 |      5.3 |       1.5 |        NULL |          0 |            0 |
    +----+------------------+-------------+-------+----------+----------+-----------+-------------+------------+--------------+
    20 rows in set (0,00 sec)
    
    mysql> SHOW COLUMNS FROM reduction ;
    +--------+--------------+------+-----+---------+----------------+
    | Field  | Type         | Null | Key | Default | Extra          |
    +--------+--------------+------+-----+---------+----------------+
    | id     | int          | NO   | PRI | NULL    | auto_increment |
    | valeur | varchar(100) | NO   |     | NULL    |                |
    +--------+--------------+------+-----+---------+----------------+
    2 rows in set (0,01 sec)
    
    mysql> SELECT * FROM reduction ;
    +----+--------+
    | id | valeur |
    +----+--------+
    |  1 | -10%   |
    |  2 | -30%   |
    +----+--------+
    2 rows in set (0,00 sec)
    



    Quelqu'un a t-il rencontré le même problème  ?

    Merci, et bon courage.


    Sacha

    -
    Edité par SachaCzarnecki 11 mai 2022 à 17:15:44

    • Partager sur Facebook
    • Partager sur Twitter
      11 mai 2022 à 17:44:29

      Bonjour,

      Dans la table aliment tu as de nombreux enregistrement avec la valeur 0 dans la colonne reduction_id. Cette valeur n'existant pas dans la table reduction la contrainte de clé étrangère échoue ... D'où l'erreur.

      Pour corriger il suffit de mettre à NULL au lieu de 0 :

      UPDATE aliment
      SET reduction_id = NULL
      WHERE reduction_id = 0;

      Puis de relancer la création de la clé étrangère ...

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        11 mai 2022 à 19:08:05

        Super merci beaucoup !! 

        En fait à un moment je me suis dit que l'erreur venait de là donc j'ai fait :

        ALTER TABLE aliment MODIFY reduction_id INT ;   

        Et je pensais que j'aurais donc des NULL à la place de 0 et que ça fonctionnerait. Mais effectivement je ne me suis même pas rendu compte... manque de rigueur.

        Merci encore une fois, 

        Bonne soirée

        • Partager sur Facebook
        • Partager sur Twitter

        Erreur Ajout d'une relation à plusieurs

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        • Editeur
        • Markdown