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 :

ON DUPLICATE KEYS UPDATE non reconnu


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2020
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Chef de projets

    Informations forums :
    Inscription : Février 2020
    Messages : 11
    Points : 7
    Points
    7
    Par défaut ON DUPLICATE KEYS UPDATE non reconnu
    Bonjour,
    J'ai un soucis avec ON DUPLICATE KEYS.

    Voici la structure de mes tables :
    TABLE T_mouvement:
    Nom : Capture d’écran 2021-03-31 à 18.46.24.png
Affichages : 660
Taille : 43,6 Ko

    TABLE T_histo :
    Nom : Capture d’écran 2021-03-31 à 18.47.24.png
Affichages : 631
Taille : 54,8 Ko

    Et enfin, voici la requête SQL que j'essaye d'executer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    INSERT INTO T_histo(periode, compte, somme_depuis_periode)
    SELECT imputation, depuis, montant
    FROM `T_mouvement` 
    GROUP BY depuis, imputation
    ORDER BY id_mouvement ASC
    ON DUPLICATE KEYS UPDATE T_histo.periode=T_mouvement.imputation, T_histo.compte=T_mouvement.depuis
    Le problème, c'est que mySQL ne reconnait pas le mot "DUPLICATE" de la fonction "ON DUPLICATE KEYS UPDATE".
    Voici les erreurs :
    Analyse statique :

    15 erreurs trouvées lors de l'analyse.

    Mot clé non reconnu. (near "KEYS" at position 186)
    Un nouvel énoncé a été trouvé, mais il n'y a aucun délimiteur entre celui-ci et le précédent. (near "UPDATE" at position 191)
    Jeton inattendu. (near "UPDATE" at position 191)
    Jeton inattendu. (near "=" at position 213)
    Jeton inattendu. (near "T_mouvement" at position 214)
    Jeton inattendu. (near "." at position 225)
    Jeton inattendu. (near "imputation" at position 226)
    Jeton inattendu. (near "," at position 236)
    Jeton inattendu. (near "T_histo" at position 238)
    Jeton inattendu. (near "." at position 245)
    Jeton inattendu. (near "compte" at position 246)
    Jeton inattendu. (near "=" at position 252)
    Jeton inattendu. (near "T_mouvement" at position 253)
    Jeton inattendu. (near "." at position 264)
    Jeton inattendu. (near "depuis" at position 265)
    Voici également la configuration de mon serveur :
    Nom : Capture d’écran 2021-03-31 à 18.50.17.png
Affichages : 616
Taille : 29,0 Ko

    PS : J'effectue ces requêtes à l'aide de phpMyAdmin.

    Quelqu'un a-t-il une idée de ce qui cloche ?

    Merci par avance,
    Thibault

  2. #2
    Membre averti
    Profil pro
    Administrateur
    Inscrit en
    Mai 2008
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2008
    Messages : 237
    Points : 433
    Points
    433
    Par défaut
    La bonne syntaxe serait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ON DUPLICATE KEY UPDATE
    et non

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ON DUPLICATE KEYS UPDATE
    Par contre, je ne sais pas si MySQL implemente ON DUPLICATE KEY avec un SELECT

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2020
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Chef de projets

    Informations forums :
    Inscription : Février 2020
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Super, merci ! Erreur bête...
    Concernant le SELECT, la seule façon de le savoir, c'est de résoudre la prochaine erreur

    #1054 - Champ 'T_mouvement.imputation' inconnu dans field list
    Ce champ existe pourtant bien... Promis, j'ai regardé l'orthographe cette fois !

  4. #4
    Membre averti
    Profil pro
    Administrateur
    Inscrit en
    Mai 2008
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2008
    Messages : 237
    Points : 433
    Points
    433
    Par défaut
    Après test les versions recentes de MySQL implémentent bien un INSERT .... SELECT ... ON DUPLICATE KEY

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    INSERT INTO T_histo(periode, compte, somme_depuis_periode)
    SELECT imputation, depuis, montant
    FROM T_mouvement
    GROUP BY depuis, imputation
    ORDER BY id_mouvement ASC
    ON DUPLICATE KEY UPDATE T_histo.periode = T_mouvement.imputation, T_histo.compte = T_mouvement.depuis

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2020
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Chef de projets

    Informations forums :
    Inscription : Février 2020
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Super, merci d'avoir pris le temps de tester.
    Et pour le fait que le champ ne soit pas reconnu, as-tu une idée ?
    L'idée étant que s'il existe déjà une ligne où T_histo.periode = T_mouvement.imputation et T_histo.compte = T_mouvement.depuis, il la mette à jour. Sinon, il en insert une nouvelle.

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 190
    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 190
    Points : 39 084
    Points
    39 084
    Billets dans le blog
    9
    Par défaut
    Bonsoir

    Ce n'est pas l'objet de votre question, mais je constate que le typage des colonnes est très mauvais :
    - les montants dans un type double auront une mauvaise précision décimale, il faut utiliser un type decimal pour préserver la précision
    - les colonnes alphanumériques sont de type texte avec un collation UTF8MB4. C'est un type très encombrant et une collation également encombrante, vu le nom des colonnes, je doute que ces choix soient judicieux.
    il faudrait plus probablement du char fixe si la longueur maxi est faible (cas du compte comptable par exemple) ou du varchar si elle est plus importante et sujette à variation selon les lignes.

    À vérifier

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2020
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Chef de projets

    Informations forums :
    Inscription : Février 2020
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Bonsoir escartefigue,
    Merci pour ces conseils. Il est vrai que je début dans cette BDD, et n'ai pas encore vraiment cherché à l'optimiser.
    Je vais modifier ça.

    Bonne soirée

  8. #8
    Membre confirmé Avatar de isabelle.letrong
    Femme Profil pro
    Conseil - Consultante en systèmes d'information
    Inscrit en
    Juillet 2010
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Conseil - Consultante en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2010
    Messages : 109
    Points : 487
    Points
    487
    Par défaut
    Citation Envoyé par ThibaultCollin Voir le message
    Et pour le fait que le champ ne soit pas reconnu, as-tu une idée ?
    Bonjour,

    En préambule, dans votre requête la clause 'group by' ne sert à rien puisqu'elle est faite pour travailler sur des agrégats (vous n'agrégez pas des données pour en faire une somme, une moyenne, etc..).
    En second lieu, concernant le champ non reconnu : dans votre clause insert, la sous-requête SELECT produit une table interne QUI N'EST PAS LA TABLE 'T_mouvement'.
    Si vous voulez vraiment préfixer 'imputation' et 'depuis' par un nom de table, utilisez un alias pour nommer la table interne issue du SELECT (Donc après la clause ORDER et avant 'ON DUPLICATE...' introduisez 'AS T1' ce qui vous permettra de référencer les colonnes sources respectivement par T1.imputation et T1.depuis. Sinon, plus simplement, comme il n'y a pas de confusion possible (pas d'homonymie de colonnes) vous pouvez juste référencer les colonnes de cette table interne par 'imputation' et 'depuis'.

Discussions similaires

  1. Réponses: 1
    Dernier message: 25/03/2009, 08h44
  2. 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
  3. Syntaxe ON DUPLICATE KEY UPDATE
    Par JoN28fr dans le forum Requêtes
    Réponses: 7
    Dernier message: 27/02/2008, 09h32
  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