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 :

insertion avec sous requête et ON DUPLICATE KEY


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Inscrit en
    Juin 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 242
    Points : 94
    Points
    94
    Par défaut insertion avec sous requête et ON DUPLICATE KEY
    Bonjour,

    j'ai un peu de mal a écrire une requête d'insertion avec une sous requête et ON DUPLICATE KEY que je découvre.

    j'ai 2 tables une qui gère des règles de quota (limitation des consultations) et une qui gère un compteur de consultation mensuel par règles.
    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
     
    CREATE TABLE `bib_quota_regle` (
      `ID_BibQuota_Regle` mediumint(6) unsigned NOT NULL AUTO_INCREMENT,
      `ID_BibQuota` mediumint(6) unsigned NOT NULL,
      `Support` varchar(45) NOT NULL ,
      `Quota_value` smallint(3) unsigned NOT NULL COMMENT 'le nombre de autorisé',
      `Type_Quota` smallint(1) unsigned NOT NULL DEFAULT '2' ,
      `Periodicite` smallint(3) unsigned NOT NULL COMMENT '30->mois',
      PRIMARY KEY (`ID_BibQuota_Regle`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=7 ;
     
     
    CREATE TABLE `user_quota_mois` (
      `ID_UserQuotas_Mois` mediumint(6) unsigned NOT NULL AUTO_INCREMENT,
      `ID_User` smallint(6) unsigned NOT NULL,
      `ID_BibQuota_Regle` mediumint(6) unsigned NOT NULL,
      `Annee` smallint(5) unsigned NOT NULL,
      `Mois` tinyint(2) unsigned NOT NULL,
      `Quota_Cpt` smallint(6) unsigned NOT NULL,
      PRIMARY KEY (`ID_UserQuotas_Mois`),
      KEY `Annee` (`Annee`,`Mois`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
    Je voudrais que lorsque une consultation est faite selon une règle définie on enregistre un nouvelle ligne de compteur pour le mois de l'année en cours si ce dernier n'existe pas et updater le compteur de 1 si la ligne est déjà présent pour le mois de l'année en cours.

    Je ne connais pas l'ID_BibQuota_Regle mais peut le retrouver à partir d'un select.

    ça donnerait quelque chose comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO user_quota_mois (ID_User, ID_BibQuota_Regle, Annee, Mois, Quota_Cpt)
    VALUES (1, SELECT ID_BibQuota_Regle FROM bib_quota_regle WHERE ID_BibQuota=1 AND Support="1" AND Type_Quota="1",YEAR(CURDATE()), MONTH(CURDATE()), Quota_Cpt + 1)
    ON DUPLICATE KEY UPDATE xxx
    ;
    La requête plante sur le SELECT je ne sais pas pourquoi,
    Je ne sais pas comment paramétrer ON DUPLICATE KEY UPDATE que je viens de decouvrir pour qu'il y ait l'unicité des ligne ID_BibQuota_Regle, Mois Annee. Peut être faut il aussi changer la structure de la table...

    Merci par avance de votre aide

  2. #2
    Membre régulier
    Inscrit en
    Juin 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 242
    Points : 94
    Points
    94
    Par défaut
    je laisse tombé la sous requête pour le moment et j'avance sur le ON DUPLICATE KEY qui me pose encore problème.

    Donc pour faire ce que je voudrais voila requête que j'ai écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    INSERT INTO user_quota_mois (ID_User, ID_BibQuota_Regle, Annee, Mois, Quota_Cpt)
    VALUES (1, 1,YEAR(CURDATE()), MONTH(CURDATE()), (Quota_Cpt + 1))
    ON DUPLICATE KEY UPDATE ID_User = 1,ID_BibQuota_Regle = 1, Annee = YEAR(CURDATE()), Mois = MONTH(CURDATE());
    J'ai changé la structure pour rendre unique ID_User, ID_BibQuota_Regle, Annee, Mois


    Lorsque je passe la requête la première fois, la ligne est créer, si je l'a passe une seconde fois, je n'ai pas de ligne supplémentaire ce qui voudrait dire que le ON DUPLICATE KEY fonctionne MAIS le compteur reste a 1 au lieu de passer à 2.
    Quelqu'un a t"il une reponse?

  3. #3
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 040
    Points : 23 795
    Points
    23 795
    Par défaut
    Et pour cause, le compteur ne risque pas d'évoluer vu que MySQL ne connaît pas Quota_Cpt... C'est même très étonnant qu'il laisse passer l'insertion en remplaçant Quota_Cpt par 0, sans message d'erreur.
    Eventuellement, tu peux passer par une variable, en t'inspirant de l'exemple de la suivant : http://mysql.developpez.com/faq/?pag...otation_lignes

    ced

  4. #4
    Membre régulier
    Inscrit en
    Juin 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 242
    Points : 94
    Points
    94
    Par défaut
    Merci pour ta réponse,

    A force de recherche, j'ai trouvé la solution

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO user_quota_mois (ID_User, ID_BibQuota_Regle, Annee, Mois, Quota_Cpt)
    VALUES (1, 1,YEAR(CURDATE()), MONTH(CURDATE()), 1)
     ON duplicate KEY UPDATE Quota_Cpt = Quota_Cpt + 1
    et je me suis inspirée de ce site http://www.mysqlperformanceblog.com/...mary-counters/

    Maintenant il me reste encore la problématique de la sous requête
    si j'ecris

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO user_quota_mois (ID_User, ID_BibQuota_Regle, Annee, Mois, Quota_Cpt)
    VALUES (1, SELECT ID_BibQuota_Regle FROM bib_quota_regle WHERE ID_BibQuota=1 AND Support="1||2" AND Type_Quota="2",YEAR(CURDATE()), MONTH(CURDATE()), 1)
     ON duplicate KEY UPDATE Quota_Cpt = Quota_Cpt + 1;
    j'ai l'erreur sql suivante
    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT ID_BibQuota_Regle FROM bib_quota_regle WHERE ID_BibQuota=1 AND Support="1' at line 2
    Est ce que vous avez la solution pour la sous requête?

    merci par avance

  5. #5
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 040
    Points : 23 795
    Points
    23 795
    Par défaut
    Bonjour,

    La syntaxe pour coupler INSERT et SELECT est plutôt la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO la_table (champ1, champ2, champ3...)
    SELECT valeur1, YEAR(CURDATE()), valeur3...
    Mais dans ce cas, la syntaxe ON DUPLICATE KEY n'est plus possible.

    ced

  6. #6
    Membre régulier
    Inscrit en
    Juin 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 242
    Points : 94
    Points
    94
    Par défaut
    Merci pour ta réponse.

    Le ON Duplicate Key étant plus avantageux pour moi, je vais donc abandonner le SELECT et m'arranger autrement.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Requete INSERT avec sous-requête
    Par nemo67 dans le forum Développement
    Réponses: 4
    Dernier message: 19/09/2011, 15h07
  2. Insert multiples avec sous-requête SELECT
    Par lolymeupy dans le forum Requêtes
    Réponses: 6
    Dernier message: 08/08/2011, 18h57
  3. Pb INSERT avec sous requête EXCEPTION JOIN
    Par jean-noel.guillaume dans le forum DB2
    Réponses: 2
    Dernier message: 29/12/2010, 15h32
  4. Pb d'insertion avec sous requette
    Par lord mathius dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 21/03/2005, 01h08
  5. suppression avec sous requête conditionnelle
    Par melmel dans le forum Requêtes
    Réponses: 8
    Dernier message: 19/03/2004, 00h20

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