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
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
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
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 ...
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.
il n'y a pas plus performant pour tester l'existence d'une ligne
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);
Bonjour,
Tu peux regarder du coté de la commande introduite en 9i : MERGE.
Laly.
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
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.
Le pb est que je fais un insert multiple...:
Et cela, le merge ne peut pas le faire...
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 )
Sinon, quel est le moyen de récupérer l'exception levée par la contraint d'unicité?
Merci
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 adapterEnvoyé par kluh
http://sgbd.developpez.com/oracle/ora-04091/#LE-4
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 ...)
Ok, par contre, pour le where exist, je suis obligé de passer par un curseur?
non, dans mon exemple il n'y a pas de curseur
Heu, désolé, mais je ne vois pas trop comment inclure ton exemple avec mon insert (voir plus haut)...
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.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager