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

Oracle Discussion :

[Debutant] Insert ou update...


Sujet :

Oracle

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

    Informations forums :
    Inscription : Février 2004
    Messages : 134
    Points : 46
    Points
    46
    Par défaut [Debutant] Insert ou update...
    Bonjour, y'a-t-t il un moyen rapide en terme de perf pour savoir si un enreg que l'on veut inserer dans une table existe déjà dans cette table?
    (auquel cas je devrais faire un update)
    Merci

  2. #2
    Rédacteur

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 320
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 320
    Points : 3 798
    Points
    3 798
    Par défaut
    Bonjour kluh et bienvenue sur le forum ,
    je t'invite à lire les régles , qui précise que pour les posts il faut notament préciser la version de la base , cela permet aux personnes désireuses de te répondre , d'apporter la solution la plus pertinente possible

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 134
    Points : 46
    Points
    46
    Par défaut
    Oracle 9i
    Désolé!

  4. #4
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Perso s'il existe moi je le veux bien !!!!

    Ce que je fais actuellement c'est un update et si aucune ligne n'a été affectée, un insert. Mais voila pour les perfs ...

  5. #5
    Rédacteur

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 320
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 320
    Points : 3 798
    Points
    3 798
    Par défaut
    Il n'y a pas de mal ,
    Pour verifier si lors d'un insert il existe une ligne , dans ce cas là une clé primaire ferat trés bien l'affaire , car elle garantie l'unicité des colonnes concernés :

    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
    22
    23
    24
    25
    26
     
    SQL> create table dvp ( a varchar2(10) , n number ) ;
     
    Table créée.
    SQL> alter table dvp add constraint pk_dvp primary key (a) ;
     
    Table modifiée.
     
    SQL> insert into dvp values ('a', 1) ;
     
    1 ligne créée.
     
    SQL>  insert into dvp values ('b', 1) ;
     
    1 ligne créée.
     
    SQL> insert into dvp values ('a',2) ;
    insert into dvp values ('a',2)
    *
    ERREUR à la ligne 1 :
    ORA-00001: unique constraint (FORMATION.PK_DVP) violated
     
     
    SQL> commit ; 
     
    Validation effectuée.

  6. #6
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT 1 
    FROM DUAL
    WHERE EXISTS (SELECT 1 FROM ta_table WHERE id = x);
    il n'y a pas plus performant pour tester l'existence d'une ligne

  7. #7
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Points : 848
    Points
    848
    Par défaut
    Bonjour,


    Tu peux regarder du coté de la commande introduite en 9i : MERGE.


    Laly.

  8. #8
    Rédacteur

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 320
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 320
    Points : 3 798
    Points
    3 798
    Par défaut
    Pour les perfomances , est ce que les updates sont basés sur les selects d'autres tables .

    Est ce que lors des inserts/updates tu as tracés tes requêtes ou observés des évènements d'attentes particuliers

  9. #9
    Expert Oracle confirmé

    Homme Profil pro
    Consultant Big Data
    Inscrit en
    Mars 2003
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Consultant Big Data
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2003
    Messages : 448
    Points : 926
    Points
    926
    Par défaut
    Pour info, depuis la version 9i d'Oracle, il existe la commande MERGE.

    Le MERGE effectue un INSERT si la ligne n'existe pas, sinon il effectue un UPDATE.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 134
    Points : 46
    Points
    46
    Par défaut
    Le pb est que je fais un insert multiple...:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    insert into MA_TABLE
    (DI_PRODUIT_ID , DI_CATEGORIE_ID , DI_DATE_ID , NB_DEPLACEMENT)
     
    	(select T1.ID, T2.ID, T3.ID, T0.QUANTITE   
    	 from 	TMP_PRODUIT	T0,
    			DI_PRODUIT  	T1,
    			DI_CATEGORIE	T2,
    			DI_DATE		T3
    	 where  T0.DATJOUR = T3.DATE_JOUR  
    	 and	T0.CATEGORIE = T2.CODE_CAT
    	 and	T0.PRODUIT = T1.CODE
    	)
    Et cela, le merge ne peut pas le faire...
    Sinon, quel est le moyen de récupérer l'exception levée par la contraint d'unicité?
    Merci

  11. #11
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Citation Envoyé par kluh
    Sinon, quel est le moyen de récupérer l'exception levée par la contraint d'unicité?
    Je déconseille cette méthode qui n'est pas très clean à mon avis. Les exceptions sont là pour signaler un éventuel bug ou comportement anormal. Néanmoins voila un exemple avec l'erreur 4091, je te laisse adapter

    http://sgbd.developpez.com/oracle/ora-04091/#LE-4

  12. #12
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    En fait, à mon avis, tout dépend de la proportion insert/updates.
    Si pour 1000 lignes à traiter, il y aura 999 inserts et un update, il est pas mauvais de gérer par exceptions; à l'inverse, s'il n'y a que 1 insert, le select
    where exist sera le moins couteux au final.

    par contre, par pitié, évitez la fausse bonne idée qui consiste à dire : dans tous les cas, je fais l'insert avec uniquement les colonnes de la clé primaire (quite à ce que cela déclenche une exception si la ligne existe déjà, mais c'est pas grave) et ensuite, dans tous les cas, je fais un update portant sur les autres colonnes !!!!
    (c'est peut-être plus simple à écrire, mais c'est le plus mauvais pour les performances ...)

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 134
    Points : 46
    Points
    46
    Par défaut
    Ok, par contre, pour le where exist, je suis obligé de passer par un curseur?

  14. #14
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    non, dans mon exemple il n'y a pas de curseur

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 134
    Points : 46
    Points
    46
    Par défaut
    Heu, désolé, mais je ne vois pas trop comment inclure ton exemple avec mon insert (voir plus haut)...

  16. #16
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Points : 848
    Points
    848
    Par défaut
    Je serais diablement étonné qu'on ne puisse pas le faire avec un merge

    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
     
    MERGE INTO MA_TABLE b
    USING (
      select  T1.ID DI_PRODUIT_ID, T2.ID DI_CATEGORIE_ID, T3.ID DI_DATE_ID, T0.QUANTITE NB_DEPLACEMENT  
      from    TMP_PRODUIT   T0, 
              DI_PRODUIT     T1, 
              DI_CATEGORIE   T2, 
              DI_DATE      T3 
      where   T0.DATJOUR = T3.DATE_JOUR  
        and   T0.CATEGORIE = T2.CODE_CAT 
        and   T0.PRODUIT = T1.CODE 
    ) a
    ON (a.di_produit_id = b.di_produit_id and ... <- mettre les conditions sur la PK)
    WHEN MATCHED THEN 
      SET di_date_id = a.di_date_id, nb_deplacement = a.nb_deplacement <- mettre uniquement les colonnes qui ne font pas partie de la PK
    WHEN NOT MATCHED THEN 
      INSERT (DI_PRODUIT_ID , DI_CATEGORIE_ID , DI_DATE_ID , NB_DEPLACEMENT)
      values (a.di_produit_id , a.di_categorie_id , a.di_date_id , a.nb_deplacement)

    Laly.

Discussions similaires

  1. [debutant] SQLCE et UPDATE/INSERT
    Par antrax2013 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 08/02/2009, 18h31
  2. [Debutant]Insertion nulle mais '' dans la base
    Par Tchinkatchuk dans le forum PostgreSQL
    Réponses: 10
    Dernier message: 18/04/2005, 09h58
  3. [debutant]insertion dans une BDD
    Par EssaiEncore dans le forum ASP
    Réponses: 7
    Dernier message: 10/02/2005, 14h58
  4. événement sur INSERT, DELETE, UPDATE
    Par papouAlain dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 24/12/2004, 15h40
  5. [Débutant][PS] modifier un insert en update
    Par franculo_caoulene dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 19/05/2004, 16h33

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