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 :

Problème de requête préparée sur plusieurs tables


Sujet :

MySQL

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2013
    Messages : 47
    Points : 45
    Points
    45
    Par défaut Problème de requête préparée sur plusieurs tables
    Hello tout le monde,


    Je développe un site de vote

    1 utilisateur vote pour 5 produits

    insert into de la table utilisateur OK en sgbd (mysql)
    update nb_vote= nb_vote+1 de la table produit OK

    mais comment implémenter ma table de votes constituée de FK?
    Puisque les FK sont en CASCADE sur DELETE ou UPDATE, mais pas sur un INSERT INTO.

    Dois-je me servir de pdo::lastInsertId()?

    voici un exemple de ma base de données.


    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    CREATE DATABASE test COLLATE utf8_general_ci;
     
     
    CREATE TABLE IF NOT EXISTS categories(
        id int(10) unsigned NOT NULL AUTO_INCREMENT,
        label varchar(50) NOT NULL,
        PRIMARY KEY (id)
        )ENGINE=InnoDB;
     
     
    CREATE TABLE IF NOT EXISTS produits(
        id int(10) unsigned NOT NULL AUTO_INCREMENT,
        id_cat int(10) unsigned NOT NULL,
        label varchar(50) NOT NULL,
        nb_vote int(10) unsigned NOT NULL,
        PRIMARY KEY (id),
        FOREIGN KEY (id_cat) references categories
        )ENGINE=InnoDB;
     
    CREATE TABLE IF NOT EXISTS users(
        id int(10) unsigned NOT NULL AUTO_INCREMENT,
        email varchar(50) NOT NULL,
        nom varchar(50) NOT NULL,
        PRIMARY KEY (id)
        )ENGINE=InnoDB;
     
     CREATE TABLE IF NOT EXISTS votes(
        id int(10) unsigned NOT NULL AUTO_INCREMENT,
        id_user int(10) unsigned NOT NULL,
        id_produit int(10) unsigned NOT NULL,
        PRIMARY KEY (id),
        FOREIGN KEY (id_user) references users(id),
        FOREIGN KEY (id_produit) references produits(id)
        )ENGINE=InnoDB;
     
    CREATE UNIQUE INDEX inx_email ON users(email)

    Bien à vous

  2. #2
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2013
    Messages : 47
    Points : 45
    Points
    45
    Par défaut
    Hello.

    Personne pour m’éclairer.

    Je n'en peux plus de ne pas comprendre. Je n'avance pas.
    Voilà un fragment de requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO te_votes_vt (vt_pro_id) SELECT pro_id FROM te_produits_pro WHERE pro_nom="Buste de Jules César" AND pro_cat_id=1
    Donc vous l'aurez compris: la table te_votes_vt est constituée de 2 champs (FK).
    Le premier champ est lié à l'ID du produit 'vt_pro_id', même principe pour le sond champ, mais cette fois-ci c'est ID utilisateur qui est enregistré.
    Mais à chaque fois que j'entreprends l'enregistrement dans la table j'ai ce message d'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    : Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails
    Merci de bien vouloir m'éclairer... svp.

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2013
    Messages : 47
    Points : 45
    Points
    45
    Par défaut
    Petit pas après petit pas j'avance...
    Bon, donc quand j'essaie dans la console de phpmyadmin sans faire de sous requête, je n'ai pas de problème d'insertion, ce qui est un bon point. Maintenant je sais qu'il s'agit d'un problème de syntaxe.
    J'ai plusieurs problématiques, comme les requêtes préparées explicitées ci dessus, mais ce n'est pas bloquant. C'est crade, mais ça marche.
    Chaque chose en son temps, par contre là je mouline...
    J'explique:
    J'ai une table vote avec deux champs ( vt_uti_id) (vt_pro_id) déclarés FK.
    Donc un utilisateur issu de la table utilisateur(uti) vote pour un produit issu de la table produit(pro)
    Actuellement j'essaie un truc comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO te_votes_vt (vt_pro_id, vt_uti_id) SELECT pro_id FROM te_produits_pro WHERE pro_nom="Buste de Jules César" AND pro_cat_id=1, 10
    J'utilise une sous requête SELECT pour le premier champ et ...rien pour le second (10 (id existant )), j'ai bien essayé VALUES, mais ça ne marche pas...

    Merci pour votre aide.

    edit , marche pas non plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO te_votes_vt SET vt_pro_id= (SELECT pro_id FROM te_produits_pro WHERE pro_nom="Buste de Jules César" AND pro_cat_id=1), SET vt_uti_id='10';

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2013
    Messages : 47
    Points : 45
    Points
    45
    Par défaut
    Lol...
    Je fais les demandes et les réponses.
    Une partie du problème réglé.
    La bonne syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO te_votes_vt SET vt_pro_id= (SELECT pro_id FROM te_produits_pro WHERE pro_nom="Buste de Jules César" AND pro_cat_id=1), vt_uti_id=10;
    Je suis bien content d'avoir réglé un de mes problèmes.
    L'autre court toujours...

  5. #5
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Bonjour

    1) Une requête correctement indentée et aérée est plus facile à lire, à comprendre, à débugguer.

    2) En SQL, les chaînes de caractères s'écrivent entre apostrophes, pas entre guillemets.


    Autre solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    INSERT INTO te_votes_vt (vt_pro_id, vt_uti_id) 
    SELECT pro_id, 10
    FROM te_produits_pro 
    WHERE pro_nom = 'Buste de Jules César' 
    	AND pro_cat_id = 1
    Sur le plan de la conception de votre programme applicatif...
    Puisque vous insérez directement la valeur 10 pour vt_uti_id, c'est que vous avez cette info quelque part dans votre interface applicative. Pourquoi n'est-ce pas le cas pour l'identifiant du produit ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    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. problème pour requête SELECT sur plusieurs tables
    Par 3dagard dans le forum Requêtes
    Réponses: 15
    Dernier message: 18/08/2008, 00h34
  2. [SQL] requêtes SQL sur plusieurs tables
    Par zahiton dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 24/11/2005, 16h32
  3. Encore une requête complexe sur plusieurs tables
    Par DenPro dans le forum Langage SQL
    Réponses: 5
    Dernier message: 09/12/2003, 19h05
  4. Requête complexe sur plusieurs table
    Par DenPro dans le forum Langage SQL
    Réponses: 13
    Dernier message: 25/11/2003, 17h50
  5. A propos d'une requête SQL sur plusieurs tables...
    Par ylebihan dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/09/2003, 16h26

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