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
    Futur 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 : 37
    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
    Points : 6
    Points
    6
    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 éclairé 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
    Points : 769
    Points
    769
    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
    A bove ante, ab asino retro, a stulto undique caveto

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

    Informations forums :
    Inscription : Mars 2002
    Messages : 735
    Points : 807
    Points
    807
    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 émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    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...

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

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

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    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

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  6. #6
    Futur 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 : 37
    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
    Points : 6
    Points
    6
    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 éclairé
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    735
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 735
    Points : 807
    Points
    807
    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 émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    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...

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

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

    Informations forums :
    Inscription : Mars 2002
    Messages : 735
    Points : 807
    Points
    807
    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 émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    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 ?

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

+ 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, 17h08
  2. Réponses: 15
    Dernier message: 27/12/2009, 13h13
  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, 16h32
  4. [CSV] Proposer un fichier qui n'existe pas encore
    Par syl202 dans le forum Langage
    Réponses: 4
    Dernier message: 15/11/2008, 17h58
  5. $GET_['tmp'] quand tmp n'existe pas encore ?
    Par sunshine33 dans le forum Langage
    Réponses: 3
    Dernier message: 17/11/2005, 13h33

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