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 :

[Access] mise à jour/ajout d'enregistrement


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 55
    Points : 41
    Points
    41
    Par défaut [Access] mise à jour/ajout d'enregistrement
    Bonjour,

    Je veux mettre à jour un enregistrement dans ma base, mais je ne sais pas s'il existe déjà, et s'il n'existe pas il faut le créer.

    Voici le code que j'utilise (ADO):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    MaBD.Execute "UPDATE MaTable SET MaValeur=Valeur WHERE Moncritère = Critère", NbMisAJour
     
    If NbMisAJour = 0 Then MaBD.Execute "INSERT INTO MaTable (Moncritère, MaValeur) VALUES (Critère,Valeur)"
    1. N'existe t-il pas une instruction SQL qui permet de le faire en 1 fois ?

    2. Sinon, y-a t-il plus performant que le code ci-dessus pour arriver au même résultat ?

    Je précise qu'il s'agit d'une base Access destinée à migrer vers SQL Server sous peu.

    Merci de vos avis

  2. #2
    Membre éprouvé
    Avatar de HULK
    Inscrit en
    Juillet 2003
    Messages
    1 276
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 276
    Points : 1 281
    Points
    1 281
    Par défaut
    sous sql server il y a NOT EXISTS qui peut t'aider je pense. Je sais pas si c'est possible sous Access.

    http://msdn2.microsoft.com/fr-fr/library/ms188336.aspx

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mars 2006
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Mars 2006
    Messages : 400
    Points : 562
    Points
    562
    Par défaut
    Tu peux faire un INSERT IGNORE.
    Dans ce cas, un enregistrement sera créé seulement s'il n'existe pas déjà.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 55
    Points : 41
    Points
    41
    Par défaut
    OK mais ca fait toujours 2 lignes a executer, puisqu'il faudra faire l'update sur ceux qui existaient déjà.

    J'ai trouvé l'instruction ON DUPLICATE KEY UPDATE mais uniquement sur MySQL apparement. Est ce qu'il ya l'équivalent chez Access / SQL Server ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    INSERT INTO T1(A, B, C)
        SELECT D, E, F FROM T2
        ON DUPLICATE KEY UPDATE B = E, C = F;

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 902
    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 902
    Points : 53 143
    Points
    53 143
    Billets dans le blog
    6
    Par défaut
    SQL:2003 à prévu l'instruction MERGE :

    extrait de mon livre "SQL" Pearson Education 2005 co écrit avec Christian Soutou :
    "
    6.4 insertion ou modification avec MERGE

    L'ordre MERGE introduit par SQL:2003, n'est pas à proprement parlé un ordre à lui tout seul, mais la combinaison d'un ordre INSERT et d'un UPDATE suivant que les données correspondent a tel ou tel critère.
    Sa syntaxe est la suivante :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    MERGE INTO <table_cible> [ [ AS ] <nom_corrélation_cible> ] 
    USING <requête_reference>  [ [ AS ] <nom_corrélation_requête> ] 
       ON <prédicat>
    WHEN MATCHED     THEN <requête_merge_update> 
    WHEN NOT MATCHED THEN <requête_merge_insert> }

    Si le prédicat est vrai, alors les lignes alimente la requête de modification (UPDATE). Dans le cas contraire (FALSE ou UNKNOWN) les lignes sont insérées. Les requêtes <requête_merge_update> et <requête_merge_insert> ne doivent pas spécifier la table puisque c'est la table cible qui est impactée dans tous les cas.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    MERGE INTO T_UTILISATEUR_USR USR
    USING (SELECT USR_ID, 
                  USR_ID + (SELECT MAX(USR_ID) 
                            FROM T_UTILISATEUR_USR) AS NEW_USR_ID,
                  USR_NOM, USR_PRENOM, USR_TITRE, 
                  USR_MAIL, USR_ORGANISATION
           FROM   T_UTILISATEUR_USR) AS USS
       ON USR.USR_NOM  = USS.USR_NOM 
          AND USR.USR_ID <> USS.USR_ID
    WHEN MATCHED THEN 
         UPDATE 
         SET    USR_NOM    = lower(USR_NOM),
                USR_PRENOM = lower(USR_PRENOM)
    WHEN NOT MATCHED THEN 
         INSERT (USR_ID, USR_NOM, 
                 USR_PRENOM, USR_TITRE,
                 USR_MAIL, USR_ORGANISATION)
         VALUES (USS.NEW_USR_ID, 
                 UPPER(USS.USR_NOM),
                 UPPER(USS.USR_PRENOM), DEFAULT,
                 USS.USR_MAIL, 'BORLAND')
    Dans cet exemple on compare les utilisateurs entre eux : s'il sont homonyme (même nom, mais pas même identifiant) alors une mise à jour intervient et noms et prénoms sont mis en minuscule. Dans le cas contraire il y a insertion, avec nom et prénom en majuscule et la valeur BORLAND comme organisation. Le calcul du nouvel identifiant étant réalisée dans le premier SELECT (colonne d'alias NEW_USR_ID).
    "

    Vérifiez si votre SGBDR supporte cet ordre SQL.

    A +

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

Discussions similaires

  1. Erreur de mise a jour d'un enregistrement
    Par sihammaster dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 06/04/2012, 11h53
  2. mise a jour d'un enregistrement
    Par popofpopof dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 29/07/2007, 09h06
  3. VB6 Access Mise a jour d'un champ
    Par getea85 dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 24/08/2006, 16h21
  4. Access mise a jour a partire des fichier Ascii
    Par mehdichess74 dans le forum Access
    Réponses: 1
    Dernier message: 25/06/2006, 13h08
  5. [Access] Mise à jour de table depuis une autre
    Par Marcant dans le forum Langage SQL
    Réponses: 4
    Dernier message: 03/06/2006, 16h53

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