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 si l'entrée existe


Sujet :

Langage SQL

  1. #1
    Membre habitué
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Points : 172
    Points
    172
    Par défaut Update si l'entrée existe
    Hello,

    J'ai une table V dans ma db qui contient un certain nombre de valeurs, chaque ligne de la table étant associée a un objet représenté par V.oid

    Dans mon prog client, je donne la possibilité de calculer ces valeurs quand l'utilisateur le souhaite. Autrement dit, la première fois qu'il calculera les valeurs, je fera un insert pour l'objet en question dans la table V, et toutes les fois suivantes, je fera un update.

    Pour le moment, je lance mon insert, et si j'ai une erreur m'indiquant que l'ID de l'objet existe déjà dans la table, je fais un update.

    Ma question est: est-ce optimal? J'ai croisé des solutions telles que ON DUPLICATE KEY sous mysql mais ca n'est pas standard de ce que j'ai compris.

    Est-ce qu'il faut mieux tester dirèctement en premier la présence de la clé de l'objet dans la table et faire en fonction ensuite? Ou bien rester sur ce que je fait en ce moment? Ou autre.. ?

    Tout commentaire / suggestion sera bievenu!
    Merci d'avance

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,
    Voilà comment je fais dans un contexte similaire.

    Dans la procédure stockée qui fait la création ou la mise à jour.
    Je commence par la mise à jour, si le nombre de ligne modifiée =0 alors je fais la création. Comme cela il n'y a pas d'erreur.
    Pour tester le nombre de lignes modifiée j'utilise la variable @@rowcount sur SQL server. Je ne peux pas te donner l'équivalent en Mysql.

    a+
    Soazig

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Ce n'est pas supporté par MySQL, mais n'oubliez pas l'opérateur MERGE sous Oracle 9i+ et MS SQL Server 2008 qui permet en un seul ordre de gérer ces deux opérations.

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    Et qui fait partie intégrante de la norme SQL !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Citation Envoyé par soazig Voir le message
    Bonjour,
    Dans la procédure stockée qui fait la création ou la mise à jour.
    Je commence par la mise à jour, si le nombre de ligne modifiée =0 alors je fais la création. Comme cela il n'y a pas d'erreur.
    Pour tester le nombre de lignes modifiée j'utilise la variable @@rowcount sur SQL server. Je ne peux pas te donner l'équivalent en Mysql.
    Le problème de cette technique est que, dans un environnement multi-sessions, une autre session peut venir écrire une ligne entre le court moment où l'update a modifié 0 ligne et celui où l'insert démarre. Pour éviter ça, on peut mettre cette séquence d'ordres SQL en section critique en la protégeant avec un verrou, l'inconvénient étant que ça créé un point de contention.
    L'avantage du MERGE fait par le SGBD est que sa gestion du verrouillage va être certainement plus fine et efficace que ce qu'on peut faire en dehors.

  6. #6
    Membre habitué
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Points : 172
    Points
    172
    Par défaut
    MERGE semble être ce que je cherchais, merci a vous pour vos lumières

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

Discussions similaires

  1. Update sans effacer l'existant
    Par Daviloppeur dans le forum Débuter
    Réponses: 2
    Dernier message: 31/08/2009, 16h45
  2. Réponses: 2
    Dernier message: 20/08/2009, 12h03
  3. [A-03] afficher si une entrée existe
    Par lefresh dans le forum IHM
    Réponses: 13
    Dernier message: 16/03/2009, 22h16
  4. Update d'une entrée pas en mémoire
    Par Faiche dans le forum JPA
    Réponses: 0
    Dernier message: 16/12/2008, 12h24
  5. Réponses: 2
    Dernier message: 21/05/2007, 18h55

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