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 :

Syntaxe ON DUPLICATE KEY UPDATE


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Octobre 2005
    Messages : 117
    Points : 57
    Points
    57
    Par défaut Syntaxe ON DUPLICATE KEY UPDATE
    Bonjour à tous,

    Je crée tous les jours une base de données à l'aide d'un fichier que je récupère de façon quotidienne. Pour celà, j'utilise : LOAD DATA INFILE

    Je crée donc une base avec dans le nom la date du jour.

    Il faut ensuite que j'importe cette base du jour dans la base générale. C'est là que le problème survient, car il faut mettre des enregistrements à jour sinon je me retrouve avec des "duplicate key".

    Mais je n'arrive pas à créer cette requête....

    Donc, ma requête est la suivante : INSERT INTO imports SELECT * FROM imports080202033001;

    A laquelle il faut que j'ajoute : ON DUPLICATE KEY UPDATE

    Ma clé primaire est composée de 4 champs : fse_control_no, call_no, job_no, orig_call_date

    Comment créer la requête avec ON DUPLICATE KEY UPDATE ??

    Par avance, merci beaucoup !

  2. #2
    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 018
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

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

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

    Il suffit de séparer les différentes mises à jour par une virgule :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO imports
    SELECT...
    ON DUPLICATE KEY UPDATE fse_control_no = ... , call_no = ... , job_no = ... , orig_call_date = ...
    Ca marche comme un UPDATE, sans le SET au départ...

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  3. #3
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Octobre 2005
    Messages : 117
    Points : 57
    Points
    57
    Par défaut
    Merci pour cette réponse, j'ai donc fait la requête suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO imports
    SELECT *
    FROM imports080202033001 ON DUPLICATE
    KEY UPDATE `fse_control_no`=`fse_control_no`, `call_no`=`call_no`, `job_no`=`job_no`, `orig_call_date`=`orig_call_date`;
    Mais MySql me répond : #1052 - Champ: 'fse_control_no' dans field list est ambigu.

    Je tiens à préciser que les deux tables à fusionner sont strictement identiques (champs et clé primaire).

  4. #4
    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 018
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 018
    Points : 23 710
    Points
    23 710
    Par défaut
    Euh, ça a peut de chance de marcher si tu remets les mêmes valeurs dans les champs clef, qui forment justement des doublons...
    Sinon, l'ambiguïté vient du fait que les deux tables portent les mêmes noms de colonnes. Il faut passer par un alias :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO imports
    SELECT *
    FROM imports080202033001 as i ON DUPLICATE
    KEY UPDATE `fse_control_no`= i.`fse_control_no`, `call_no`= i.`call_no`, `job_no`= i.`job_no`, `orig_call_date`= i.`orig_call_date`;
    J'ai mis des alias (i) partout, à toi d'adapter en fonction de cas...

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  5. #5
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Octobre 2005
    Messages : 117
    Points : 57
    Points
    57
    Par défaut
    Ok, merci, cela semble fonctionner.

    Donc si j'ai bien compris, cette requête va créer un alias de ma table imports080202033001 nommé i, et insérer toutes les valeurs de la table imports080202033001 dans la table imports en updatant avec les valeurs de imports080202033001 si la clé existe déjà dans la table imports ?

    Merci ced.

  6. #6
    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 018
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 018
    Points : 23 710
    Points
    23 710
    Par défaut
    Effectivement, l'alias i permet de distinguer ta table de la table d'import dans l'update.
    Pour l'insertion, il y a quand même un hic avec ton code. Si il y a un doublon, c'est que la clef existe déjà. Or, tu fais un update sans modifier aucune des valeurs des champs constituant la clef de ta table d'import. Ca ne marchera pas, puisque ce sont justement ces valeurs qui sont en doublon et que tu as déjà essayé d'insérer.
    Pour éviter ça, il faut faire quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    INSERT INTO imports
    SELECT *
    FROM imports080202033001 AS i ON DUPLICATE
    KEY UPDATE `fse_control_no`= i.`fse_control_no` + 1, 
    `call_no`= i.`call_no`, `job_no`= i.`job_no`, `orig_call_date`= i.`orig_call_date`
    ...par exemple. En fait il faut modifier une ou plusieurs des valeurs de la clef pour obtenir une clef unique.

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  7. #7
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Octobre 2005
    Messages : 117
    Points : 57
    Points
    57
    Par défaut
    J'ai donc 4 champs qui constituent une clé pour une entrée dans la base de données.

    Cette entrée comprend bien évidemment d'autres champs tels que call_status par exemple, qui prend les valeurs "live" ou "completed"

    Si l'entrée est passée de live à completed, je souhaite que l'ancienne valeur soit écrasée dans la base de donnée pour ne conserver que le statut le plus récent.

    il faut donc bien que je mette tous mes champs un par un après "ON DUPLICATE
    KEY UPDATE" ?

  8. #8
    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 018
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 018
    Points : 23 710
    Points
    23 710
    Par défaut
    ON DUPLICATE KEY te permet de mettre à jour une entrée qui existe déjà et que tu tentes d'insérer de nouveau. Mais pour que cette mise à jour fonctionne et que l'entrée ne soit plus dupliquée, il faut modifier sa clef primaire (sinon, elle reste dupliquée).
    Pour le changement de statut, c'est plutôt la commande REPLACE que tu dois utiliser : REPLACE marche comme un INSERT, sauf que si une entrée existe déjà avec la même clef primaire, elle est supprimée (l'équivalent d'un DELETE) et remplacée par la nouvelle entrée.
    Voilà le lien vers la documentation de REPLACE.

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

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

Discussions similaires

  1. ON DUPLICATE KEY UPDATE pour plusieurs lignes
    Par raphael_kindt dans le forum Requêtes
    Réponses: 1
    Dernier message: 09/11/2009, 12h45
  2. Réponses: 1
    Dernier message: 25/03/2009, 08h44
  3. INSERT .. ON DUPLICATE KEY UPDATE fait que des INSERT !
    Par umeboshi dans le forum Requêtes
    Réponses: 2
    Dernier message: 30/07/2008, 09h40
  4. ON DUPLICATE KEY UPDATE et unicité sur 2 colonnes
    Par dja07 dans le forum SQL Procédural
    Réponses: 8
    Dernier message: 07/06/2007, 16h54
  5. INSERT ... ON DUPLICATE KEY UPDATE
    Par luffy san dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 17/10/2005, 17h29

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