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

Requêtes MySQL Discussion :

Exécution de 4 requêtes d'insertion de 4 tables différentes en même temps


Sujet :

Requêtes MySQL

  1. #1
    Candidat au Club
    Homme Profil pro
    dba
    Inscrit en
    Mai 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : dba
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2019
    Messages : 7
    Points : 4
    Points
    4
    Par défaut Exécution de 4 requêtes d'insertion de 4 tables différentes en même temps
    j'ai 4 table en BD, sont voiture,catégorie,marque,modèle et cet dernier table contient 3 clés étrangères d'autre tables ....

    voila mon schéma relationnelle :

    voiture (id_voiture,n_immatriculation_v,couleur)
    catégorie(id_catégorie,nom_catégorie)
    marque(id_marque,nom_marque)
    modèle(id_modèle,nom_modèle,id_catégorie_m,id_marque_m,id_voiture_m)

    voila formulaire en photo ( les 3 tables catégorie,marque et modèle sont sous forme des liste déroulantes)

    remarque : la table voiture contient plusieurs champs dont une image mais je m'intéresse maint que pour les champs cites ci_dessus [voiture (id_voiture,n_immatriculation_v,couleur) ].

    alors comment je peux insérer une voiture afin d'insérer en même temps les donnes de listes en table modèle ???????
    Images attachées Images attachées  

  2. #2
    Membre chevronné

    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2013
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : développeur

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 576
    Points : 1 989
    Points
    1 989
    Par défaut
    Salut,

    Dans quel cas tu fais l'insertion? avec du code ou via une requête sql dans ton sgbd?

  3. #3
    Candidat au Club
    Homme Profil pro
    dba
    Inscrit en
    Mai 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : dba
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2019
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    via une requête sql !!

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Pour moi il n'y a pas d'insertion dans 4 tables différentes, mais dans une seule: la table voiture.
    Les autres sont "présentes" dans la fenêtre sous forme de liste déroulante, donc les lignes sont déjà dans les tables respectives.
    Il faut juste en récupérer les id, qui doivent être présents dans les listes déroulantes.
    Les ajouts d'une nouvelle catégorie, d'une nouvelle marque ou d'un nouveau modèle se font dans d'autres fenêtres.

    Tatayo.

  5. #5
    Candidat au Club
    Homme Profil pro
    dba
    Inscrit en
    Mai 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : dba
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2019
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    selon votre proposition on doit changer le modèle relationnel la chose interdite en mon cas ..... je doit insérer les donnes respectant le modèle donne ci_dessus !!!!!

  6. #6
    Candidat au Club
    Homme Profil pro
    dba
    Inscrit en
    Mai 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : dba
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2019
    Messages : 7
    Points : 4
    Points
    4
    Par défaut proposition :
    j'ai pensé à quelque chose comme ça:

    j'ai fait deux requêtes qui vont s'exécuter l'une après l'autre (première requête est pour l'insertion de voiture et puis la deuxième pour insérer les données en modèle tenant compte du dernier id inséré dans voiture )

    1 requête d'insertion en voiture :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $req_voiture="INSERT INTO voiture (........)";
    $res_req_voiture= $connection->query($req_voiture) or die("Erreur dans $req_voiture");

    2 requête d'insertion en modèle :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $cat=$_POST['categorie'];
    $mrq=$_POST['marque'];
    $mod=$_POST['modele'];		
    $req_modele="inert into modele (nom_modele,id_v_modele,id_cat_modele,id_mrq_modele) 
                 select nom_modele,id_voiture,id_categorie,id_marque
                 from modele m1,modele m2,voiture,categorie,marque
                 where voiture.id_voiture=lastInsertId()
                 and   categorie.id_categorie=$cat
                 and   marque.id_marque=$mrq
                 and  ( m1.nom_modele=$mod and m1.id_modele=m2.id_modele)
               ";
    $res_req_modele= $connection->query($req_modele) or die("Erreur dans $req_modele");

    est-ce que c'est correct en SQL ???

  7. #7
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 134
    Points : 38 557
    Points
    38 557
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Borora Voir le message
    j'ai fait deux requêtes qui vont s'exécuter l'une après l'autre (première requête est pour l'insertion de voiture et puis la deuxième pour insérer les données en modèle tenant compte du dernier id inséré dans voiture )
    Sauf si je n'ai pas compris votre modèle de données, normalement, plusieurs voitures sont du même modèle et un modèle concerne 0 à plusieurs voitures

    Soit au niveau conceptuel MARQUE 0,n--- posseder--- 1,1 MODELE 0,n --- appartenir --- 1,1 VOITURE
    Et au niveau logique, les tables suivantes (PK soulignées, FK suffixées par #)
    MA_MARQUE(MA_id, MA_libellé, MA_date_crea, ...)
    MO_MODELE (MO_id, MO_designation, ..., MA_id#)
    VO_VOITURE(VO_id, VO_immatriculation, ..., MO_id#)

    Il faut donc insérer d'abord le MODELE pour connaitre la valeur de la colonne MO_id afin de pouvoir l'ajouter comme FK dans la table VOITURE

    Cela étant, je rejoins Tatayo, le formulaire présenté semble impliquer que le modèle pré-existe et qu'il n'est pas nécessaire de le créer quand on crée une voiture.

  8. #8
    Membre expérimenté
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 731
    Points : 1 416
    Points
    1 416
    Par défaut
    Bonsoir,
    Citation Envoyé par Borora Voir le message
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $cat=$_POST['categorie'];
    $mrq=$_POST['marque'];
    $mod=$_POST['modele'];		
    $req_modele="inert into modele (nom_modele,id_v_modele,id_cat_modele,id_mrq_modele) 
                 select nom_modele,id_voiture,id_categorie,id_marque
                 from modele m1,modele m2,voiture,categorie,marque
                 where voiture.id_voiture=lastInsertId()
                 and   categorie.id_categorie=$cat
                 and   marque.id_marque=$mrq
                 and  ( m1.nom_modele=$mod and m1.id_modele=m2.id_modele)
               ";
    $res_req_modele= $connection->query($req_modele) or die("Erreur dans $req_modele");

    est-ce que c'est correct en SQL ???
    La réponse est : non
    inert into n'est pas une commande SQL
    Le savoir est une nourriture qui exige des efforts.

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Je vois plusieurs problèmes dans la requête.
    Je me permet de la réécrire avec la "bonne" syntaxe pour les jointures:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    select nom_modele,id_voiture,id_categorie,id_marque
    from modele m1
    inner join modele m2 on m1.id_modele=m2.id_modele
    cross join voiture
    cross join categorie
    cross join marque
    where voiture.id_voiture=lastInsertId()
    and  categorie.id_categorie=$cat
    and  marque.id_marque=$mrq
    and  m1.nom_modele=$mod
    On voit bien ici que les lectures des tables categorie et marque ne servent à rien. Par exemple tu cherches la ligne de catégorie selon son id, pour récupérer son id.
    Ensuite tu ne mets pas d'alias pour nom_modele, alors que tu as 2 fois la table modele. Mais justement, concernant m1 et m2, vu que le critère de jointure est m1.id_modele=m2.id_modele, m1 et m2 "pointent" vers la même ligne.
    M2 ne sert donc à rien non plus.
    Du coup on peut simplifier:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select m1.nom_modele,id_voiture,$cat,$mrq
    from modele m1
    cross join voiture
    where voiture.id_voiture=lastInsertId()
    and  m1.nom_modele=$mod
    Cela étant dit, comme escartefigue je ne comprends rien à ton modèle.

    Tatayo.

  10. #10
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 380
    Points : 19 062
    Points
    19 062
    Par défaut
    Salut à tous.

    Votre schéma est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    voiture (id_voiture,n_immatriculation_v,couleur)
    catégorie(id_catégorie,nom_catégorie)
    marque(id_marque,nom_marque)
    modèle(id_modèle,nom_modèle,id_catégorie_m,id_marque_m,id_voiture_m)
    Comme on peut le voir dans la table "modèle", vous avez les colonnes "id_voiture_m", "id_marque_m" et "id_catégorie_m" qui sont des clefs étrangères.

    Quand vous insérez une nouvelle ligne dans la table "modèle", vous devez récupérer les identifiants de vos trois clefs étrangères.
    Ce qui implique que ces identifiants doivent exister au préalable, sinon lors de l'insertion, vous aurez une erreur #1452 !

    Comment insérer une nouvelle ligne dans la table "modèle" sachant qu'ils manquent un ou plusieurs identifiants dans vos tables "voiture", "categorie" et "marque" ?
    Il est difficile de répondre car nous ne savons pas d'où viennent vos données.
    On peut émettre l'hypothèse que cela provient d'un fichier excel.
    Dans ce cas, une ligne de votre fichier excel doit contenir des informations pouvant reconstituer vos quatre tables.

    Avant d'insérer une nouvelle ligne dans la table "modèle", vous devez vérifier l’existence de vos identifiants dans vos trois tables "voiture", "categorie" et "marque".
    Il n'y a pas d'autres solutions que de venir vérifier leur existence, et en cas d'absence, venir effectuer l'insertion respectivement dans "voiture", "categorie" et "marque".

    Le mcd étant simple, je ne comprends pas où se trouve la difficulté.
    A moins que vous ne connaissez pas ce qu'implique les contraintes des clefs étrangères.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  11. #11
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 134
    Points : 38 557
    Points
    38 557
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Artemus24 Voir le message
    Quand vous insérez une nouvelle ligne dans la table "modèle", vous devez récupérer les identifiants de vos trois clefs étrangères.
    Ce qui implique que ces identifiants doivent exister au préalable, sinon lors de l'insertion, vous aurez une erreur #1452 !
    Non, comme je l'ai expliqué précédemment, les règles de gestion sont les suivantes :

    plusieurs voitures sont du même modèle et un modèle concerne 0 à plusieurs voitures

    Exemple : le modèle "Renault Clio" concerne la voiture immatriculée 1234 XY 72 et celle immatriculée 4567 ZY 22

    Et par voie de conséquence c'est bien le modèle qui précède la voiture et non l'inverse
    L'ordre d'insertion est donc le suivant : marque puis modèle puis voiture.
    Les 3 insertions peuvent être dans une ou plusieurs transactions, mais il est évidemment incohérent d'avoir une foreign key identifiant la voiture dans la table modèle, c'est bien le contraire qu'il faut faire : mettre l'identifiant du modèle comme FK dans la table voiture.
    Cf. ma réponse du 19 juin qui détaille le contenu des tables tel qu'il devrait être modélisé.

  12. #12
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 380
    Points : 19 062
    Points
    19 062
    Par défaut
    Salut Escartefigue.

    Je n'ai fait que survoler le sujet. En effet, il y a bien un problème de modélisation.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

Discussions similaires

  1. Réponses: 8
    Dernier message: 28/10/2015, 11h37
  2. [MySQL] Requête d'insertion dans une table
    Par Qadeer dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 23/07/2015, 13h02
  3. requéte d 'insertion dans 2 table lié
    Par jalalnet dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 22/03/2011, 04h59
  4. [MySQL] pb pour vérifier l'excution d'une requête d'insertion
    Par jeinny dans le forum PHP & Base de données
    Réponses: 12
    Dernier message: 28/05/2009, 10h31
  5. Réponses: 3
    Dernier message: 08/05/2007, 17h32

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