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 :

Insertion rejetée à cause de clé étrangère


Sujet :

MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 46
    Par défaut Insertion rejetée à cause de clé étrangère
    Salut à tous,
    pouvez-vous me donner un coup de mains parce que je sèche sur un pb!
    Je cherche :

    - à insérer une commande dans la table "commandes" (là, pas de pb)

    - à récupérer l'ID générée par cette insertion parce qu'il est en auto_increment dans la table "commande" (là pas de pb)

    - à insérer plusieurs produits dans une deuxième table "lignes_de_commandes" avec ce même ID (impossible).
    En effet, j'ai le message :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Erreur SQL !
    insert into lignes_de_commandes values(DEFAULT, 7, 1, 60, 57.62, 294, 351.62)
    Cannot add or update a child row: a foreign key constraint fails nomBD.lignes_de_commandes`, CONSTRAINT `fkIDCMD_LignesDeCMD` 
     
    FOREIGN KEY (`IDCommande`) REFERENCES `commandes` (`IDCommande`))
    Table commandes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    create table commandes(
    IDCommande int(10) unsigned not null auto_increment,
     
    IDClient int(10) unsigned not null,
     
    NumeroCommande varchar(20) not null,
     
    DateCommande datetime,
     
    DateRetrait date not null,
     
    IDTypeRetrait int not null,
     
    constraint pkIDCommande primary key(IDCommande),
     
    constraint fkIDCLCommande foreign key(IDClient) references clients(IDClient),
     
    index(IDClient)
    )
    engine = InnoDB
    Table : lignes_de_commandes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
     create table lignes_de_commandes(
     IDLignesCmd int(10) unsigned not null auto_increment,
     
     IDCommande int(10) unsigned not null,
     
     IDProduit int(10) unsigned not null,
     
     QteCommandee decimal(10, 2)  not null,
     
     MontantTVA decimal(8, 2)  not null,
     
     MontantHT decimal(9, 2) not null,
     
    MontantTTC decimal(9, 2) not null,
     
     constraint pk_lignes_de_cmd primary key(IDLignesCmd),
     
     constraint fkIDProdLignesCmd foreign key(IDProduit) references produits(IDProduit),
     
     constraint fkIDCMD_LignesDeCMD foreign key(IDCommande) references commandes(IDCommande),
     
    index(IDCommande, IDProduit)
     
     )
     engine = InnoDB
    Je vous en remercie d'avance de votre aide!

    No

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Et bien sûr l'IDCommande = 7 existe au préalable dans la table des commandes ?
    Et l'IDProduit = 1 également ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 46
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Et bien sûr l'IDCommande = 7 existe au préalable dans la table des commandes ?
    Et l'IDProduit = 1 également ?
    Salut CinePhil,
    l'ID du produit, il n'y a aucun doute, il existe dans la table "produits".
    Pour l'ID de la commande, j'utilise justement le même prog PHP pour insérer une commande, récupérer l'ID généré à la suite de cette insertion, puis toujours dans le même code, je fais l'insertion dans la table "lignes_de_commandes". Je suppose que l'ID de la commande existe normalement après insertion des données puisque la colonne est en auto_increment dans la table "commandes". De plus, quand je demande à PHP de récupérer l'ID généré, il me renvoie bien un ID. Le problème, c'est que les tables "commandes" et "lignes_de_commandes" sont locked et donc, il n'y a pas de mise à jour des index. Je ne sais pas si je peux copier ici du code PHP, mais grosomodo, c'est un truc du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    lock table commandes write, lignes_de_commandes write
    insert into commandes values(...)
     
    puis récupération de l'IDCommande;
     
    puis:
    insert into lignes_de_commandes values(...)
     
    unlock
    Et ça veut pas!

    Merci à toi!

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Comment récupères-tu l'ID inséré dans la table Commande ?

    Passe dans phpMyAdmin ou en mode console dans MySQL.
    Exécutes la première requête d'insertion dans la table commandes.
    Cherche le dernier ID inséré.
    Exécutes la seconde requête d'insertion dans la table lignes_de_commandes avec la valeur du dernier ID de commande inséré et regarde si tu as toujours un message d'erreur. Ça éliminera la possibilité d'une erreur côté MySQL.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

Discussions similaires

  1. Insertion impossible à cause d'un champ
    Par Skangell dans le forum VBA Access
    Réponses: 13
    Dernier message: 24/06/2008, 11h19
  2. [MySQL] Insertions et gestion des clés étrangères
    Par b_e_n_n dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 15/06/2008, 16h14
  3. Réponses: 1
    Dernier message: 20/05/2008, 18h08
  4. Import/export sql 2000 impossible à causes des clés étrangères
    Par chouchou2clichy dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 24/03/2007, 08h27
  5. [insert][bug] cause inconnue
    Par bakonu dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 15/12/2006, 16h02

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