Partage
  • Partager sur Facebook
  • Partager sur Twitter

Erreur 1822 sur une FK mysql

    3 mars 2021 à 12:26:13

    Bonjour,

    Je ne comprend vraiment pas pourquoi j'ai cette erreur. 

    Voici le shema graphique de ma base :

    Déja cela vous parait il correct ?

    maintenant voici le code sql Utilisé : 

    CREATE TABLE `User` (
      `ID` int PRIMARY KEY NOT NULL AUTO_INCREMENT,
      `userName` varchar(255) UNIQUE NOT NULL,
      `Password` varchar(255) NOT NULL,
      `idrole` int
    );
    
    CREATE TABLE `Coupons` (
      `idCoupon` int PRIMARY KEY NOT NULL AUTO_INCREMENT,
      `CodePromoCoupon` varchar(255),
      `pourcentagereduction` int
    );
    
    CREATE TABLE `Produit` (
      `idProduit` int PRIMARY KEY NOT NULL AUTO_INCREMENT,
      `Prix` int,
      `NomPrdoduit` varchar(255),
      `stock` int
    );
    
    CREATE TABLE `PromoenCours` (
      `idPromo` int PRIMARY KEY NOT NULL AUTO_INCREMENT,
      `idProduit` int,
      `idPromoCDoupon` int
    );
    
    CREATE TABLE `Role` (
      `idrole` int PRIMARY KEY,
      `nomRole` varchar(255)
    );
    
    CREATE TABLE `Panier` (
      `idPanier` int PRIMARY KEY NOT NULL AUTO_INCREMENT,
      `totalpanier` int,
      `idUser` int
    );
    
    CREATE TABLE `PanierProduit` (
      `idPanierProduit` int PRIMARY KEY NOT NULL AUTO_INCREMENT,
      `IdPanier` int,
      `IdProduit` int
    );
    
    ALTER TABLE `PromoenCours` ADD FOREIGN KEY (`idPromoCDoupon`) REFERENCES `Coupons` (`idCoupon`);
    
    ALTER TABLE `User` ADD FOREIGN KEY (`idrole`) REFERENCES `Role` (`idrole`);
    
    ALTER TABLE `Panier` ADD FOREIGN KEY (`idUser`) REFERENCES `User` (`ID`);
    
    ALTER TABLE `PanierProduit` ADD FOREIGN KEY (`IdPanier`) REFERENCES `Panier` (`idPanier`);
    
    ALTER TABLE `PanierProduit` ADD FOREIGN KEY (`IdProduit`) REFERENCES `Produit` (`idProduit`);
    
    ALTER TABLE `Produit` ADD FOREIGN KEY (`idProduit`) REFERENCES `PromoenCours` (`idProduit`);
    


    Donc l'erreur se situe à la fin du script sur "ALTER TABLE `Produit` ADD FOREIGN KEY (`idProduit`) REFERENCES `PromoenCours` (`idProduit`);"

    ça me sort cette érreur : Error Code: 1822. Failed to add the foreign key constraint. Missing index for constraint 'produit_ibfk_1' in the referenced table 'promoencours'

    En me balandant sur stack, et en bidouillant mes table j'ai réussi a faire compilé ce code (c'était genre j'ai coché un truc sur alter table).

    Donc j'ai cru que c'était bon mais quand j'ai essayé de faire un insert dans ma table produit ça m'a dit un truc du style : 

    ERROR 1452: Cannot add or update a child row: a foreign key constraint fails

    Alors que je suis censé pouvoir inséré sans soucis dans ma table produit car elle en dépend de rien (ce n'est pas nécessaire que le l'IDproduit existe dans promo en cours).

    Donc voila j'espère avoir été clair dans l'explication de mon soucis.

    Merci !

    • Partager sur Facebook
    • Partager sur Twitter

    gbl

      3 mars 2021 à 13:06:43

      Bonjour,

      Après, lorsque tu as des relations n,n (many to many), tu n'as pas à créer un identifiant auto incrémenté comme clé primaire ... la clé primaire est dans ces cas composée sur deux colonnes, les deux ids des entités liées. C'est le problème lorsque l'on fait le MLD sans passer par un MCD ...

      Au passage, je rajouterai peut-être des dates de durée pour les coupons (début et fin), non ?

      Enfin, il faut si possible homogénéiser les libellés ... tout en français ou tout en anglais, mais mélanger c'est perturbant ...

      Ton modèle pourrait plutôt être :

      Ce qui génère le SQL (MySQL) suivant :

      CREATE TABLE `role` (
      	`id_role` INT UNSIGNED NOT NULL AUTO_INCREMENT,
      	`libelle` VARCHAR(60),
      	PRIMARY KEY (`id_role`)
      ) ENGINE=InnoDB;
      
      CREATE TABLE `utilisateur` (
      	`id_utilisateur` INT UNSIGNED NOT NULL AUTO_INCREMENT,
      	`nom` VARCHAR(60),
      	`motdepasse` VARCHAR(60),
      	`id_role` INT UNSIGNED NOT NULL,
      	PRIMARY KEY (`id_utilisateur`),
      	FOREIGN KEY (`id_role`) REFERENCES `role` (`id_role`);
      ) ENGINE=InnoDB;
      
      CREATE TABLE `produit` (
      	`id_produit` INT UNSIGNED NOT NULL AUTO_INCREMENT,
      	`designation` VARCHAR(42) NOT NULL,
      	`prix` DECIMAL(10,3) NOT NULL,
      	`stock` INT UNSIGNED NOT NULL,
      	PRIMARY KEY (`id_produit`)
      ) ENGINE=InnoDB;
      
      CREATE TABLE `panier` (
      	`id_panier` INT UNSIGNED NOT NULL AUTO_INCREMENT,
      	`date_creation` DATETIME,
      	`id_utilisateur` INT UNSIGNED NOT NULL,
      	FOREIGN KEY (`id_utilisateur`) REFERENCES `utilisateur` (`id_utilisateur`),
      	PRIMARY KEY (`id_panier`)
      ) ENGINE=InnoDB;
      
      CREATE TABLE `coupon` (
      	`id_coupon` INT UNSIGNED NOT NULL AUTO_INCREMENT,
      	`code` VARCHAR(60),
      	`pourcentage` DECIMAL(3,2),
      	`date_debut` DATETIME,
      	`date_fin` DATETIME,
      	PRIMARY KEY (`id_coupon`)
      ) ENGINE=InnoDB;
      
      CREATE TABLE `coupon_produit` (
      	`id_coupon` INT UNSIGNED NOT NULL,
      	`id_produit` INT UNSIGNED NOT NULL,
      	FOREIGN KEY (`id_produit`) REFERENCES `produit` (`id_produit`),
      	FOREIGN KEY (`id_coupon`) REFERENCES `coupon` (`id_coupon`),
      	PRIMARY KEY (`id_coupon`, `id_produit`)
      ) ENGINE=InnoDB;
      
      CREATE TABLE `panier_produit` (
      	`id_produit` VARCHAR(42),
      	`id_panier` VARCHAR(42),
      	`quantite` VARCHAR(42),
      	FOREIGN KEY (`id_panier`) REFERENCES `panier` (`id_panier`),
      	FOREIGN KEY (`id_produit`) REFERENCES `produit` (`id_produit`),
      	PRIMARY KEY (`id_produit`, `id_panier`)
      ) ENGINE=InnoDB;

      -
      Edité par Benzouye 3 mars 2021 à 13:08:16

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        4 mars 2021 à 13:55:50

        Merci beaucoup pour ça !!
        • Partager sur Facebook
        • Partager sur Twitter

        gbl

        Erreur 1822 sur une FK mysql

        × 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