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

Langage SQL Discussion :

UPDATE ou INSERT si n'existe pas encore


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2007
    Messages : 5
    Par défaut UPDATE ou INSERT si n'existe pas encore
    Bonjour,

    Je souhaiterais faire un petit module de statistiques.
    Lorsque l'on affiche une recherche, je stoque le nombre de fois que l'on affiche un objet dans cette liste. (Il y a en plus la pagination, je prends que ce qu'il est réellement affiché.)

    Je souhaiterais donc faire cette requête pour gagner pour optimiser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE restaurant_statistique SET count = count + 1 WHERE restaurant_id IN (1,5,4,2) AND jour = "2009-08-17";
    J'aimerais aussi que s'il n'y a pas d'entrée pour le jour, on créé l'entrée avec le compteur à 1.

    En regardant la doc de MySQL, j'ai vu qu'il fallait faire un INSERT avec un ON DUPLICATE KEY UPDATE champs='donnée'")
    Seulement, cela nécessite que je fasse un INSERT par entré ce qui me semble lourd à souhait. (10 requêtes par page au lieux d'une)

    Je chercherais un UPDATE ... IF NOT EXIST INSERT count = 1
    Savez-vous comment je peux régler ce problème ?

    Merci

    Natim

  2. #2
    Membre émérite Avatar de Arkhena
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 552
    Par défaut
    Bonjour,

    Je peux me tromper, mais j'aurai dit que ces traitements devaient être faits dans le programme (écrit en php?) qui gère l'affichage des statistiques et non dans le SGBD.

    A part ça, on peut peut-être ajouter un trigger sur UPDATE qui lors de ma tentative de mise à jour crée la ligne si elle n'existe pas.

    Cordialement,

    Arkhena

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    737
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 737
    Par défaut
    en Firebird il y a une syntaxe très sympa qui te permet de le faire :
    http://www.firebirdsql.org/refdocs/l...or-insert.html

  4. #4
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Salut !

    ON DUPLICATE KEY devrait marcher, si on bidouille un peu, non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    INSERT INTO restaurant_statistique(restaurant_id, jour, count)
    SELECT 1, "2009-08-17", 1 UNION ALL
    SELECT 5, "2009-08-17", 1 UNION ALL
    SELECT 4, "2009-08-17", 1 UNION ALL
    SELECT 2, "2009-08-17", 1
    ON DUPLICATE KEY UPDATE count = count + 1
    Ca n'apporte pas grand chose, certes...

  5. #5
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Citation Envoyé par VLDG Voir le message
    en Firebird il y a une syntaxe très sympa qui te permet de le faire :
    http://www.firebirdsql.org/refdocs/l...or-insert.html
    Oui, et dans la norme SQL 2003 (implémentée par Oracle 9i), il y a MERGE...

    ... mais pas sous MySQL

  6. #6
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2007
    Messages : 5
    Par défaut
    Et en PostGreSQL pendant qu'on y est ?

    Plus sérieusement, la meilleure solution serait alors de faire 10 INSERT depuis le programme ou est-ce avantageux de passer quand même par SQL même avec 10 SELECT ?

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    737
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 737
    Par défaut
    Citation Envoyé par pacmann Voir le message
    Oui, et dans la norme SQL 2003 (implémentée par Oracle 9i), il y a MERGE...

    ... mais pas sous MySQL
    Le merge existe aussi sous Firebird (Firebird est très souvent très proche de la norme)
    http://www.firebirdsql.org/refdocs/l...d21-merge.html

  8. #8
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Citation Envoyé par Natim87 Voir le message
    Et en PostGreSQL pendant qu'on y est ?

    Plus sérieusement, la meilleure solution serait alors de faire 10 INSERT depuis le programme ou est-ce avantageux de passer quand même par SQL même avec 10 SELECT ?
    Si tu utilises ON DUPLICATE KEY, je suppose que c'est plus efficace (enfin ça dépend quand même de comment marche MySQL) :
    Il ne fait qu'une fois la recherche / contrôle de la contrainte primaire pour les deux opérations...
    (et il a peut être moyen d'optimiser tout ça puisque tu le fais en bloc)

    Par contre, j'ai fait un petit test, et je pense qu'il faut corriger un peu ce que je disais avant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    INSERT INTO restaurant_statistique(restaurant_id, jour, count)
    SELECT (restaurant_id, jour, count) FROM (
      SELECT 1 AS restaurant_id, "2009-08-17" AS jour, 1  AS count UNION ALL
      SELECT 5, "2009-08-17", 1 UNION ALL
      SELECT 4, "2009-08-17", 1 UNION ALL
      SELECT 2, "2009-08-17", 1
    ) 
    ON DUPLICATE KEY UPDATE count = restaurant_statistique.count + 1
    @VLDG : comme Natim, l'important, c'est que ça marche pas sous MySQL...

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    737
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 737
    Par défaut
    @VLDG : comme Natim, l'important, c'est que ça marche pas sous MySQL...
    Il faut poster dans le bon forum alors

  10. #10
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Sachant que tu as commencé par proposer une solution spécifique Firebird (qui marche vraiment nulle part ailleurs), ça ne serait un peu de la mauvaise foi ?

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

Discussions similaires

  1. Remplir un combobox qui n'existe pas encore
    Par Thyyb dans le forum Windows Forms
    Réponses: 10
    Dernier message: 09/01/2014, 16h08
  2. Réponses: 15
    Dernier message: 27/12/2009, 12h13
  3. Pas d'erreur avec UPDATE si un champ n'existe pas !
    Par poiwalt dans le forum Langage SQL
    Réponses: 2
    Dernier message: 27/01/2009, 15h32
  4. [CSV] Proposer un fichier qui n'existe pas encore
    Par syl202 dans le forum Langage
    Réponses: 4
    Dernier message: 15/11/2008, 16h58
  5. $GET_['tmp'] quand tmp n'existe pas encore ?
    Par sunshine33 dans le forum Langage
    Réponses: 3
    Dernier message: 17/11/2005, 12h33

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