[SQL] "Insert into" et gestion des duplicata?

"Insert into" et gestion des duplicata? [SQL] - SQL/NoSQL - Programmation

Marsh Posté le 23-07-2008 à 06:24:19    

Bonjour à tous et tout d'abord bonne journée à vous!
Est-il possible d'utiliser "INSERT INTO" sans avoir d'interruption de la requête à cause d'une erreur de duplicata?
En fait, je voudrais que la requête suive son cours même lorsqu'elle rencontre un duplicata, sachant qu'elle ne doit pas écraser les duplicata.
 
Je ne sais absolument pas comment m'y prendre pour gérer ce problème, malgré mes recherches.
 
Voici mon code qui génère l'erreur de duplicata:
 
<?php
mysql_select_db($database_ConnexionBASE, $ConnexionBASE);
$query_rsSaveObservations = "INSERT INTO observations (date, c_nom, commentaires, p_nom) SELECT date, c_nom, commentaires, p_nom FROM reunion";
$rsSaveObservations = mysql_query($query_rsSaveObservations, $ConnexionBASE) or die(mysql_error());
?>
 
La clé primaire de la table 'observations' est composée des champs 'c_nom' et 'p_nom'. Le duplicata relève de la répétition du couple ('c_nom - p_nom') dans ma table 'observations'.
Peut-on faire un truc du genre: Si le couple 'c_nom - p_nom' existe déjà, n'insère pas les enregistrements qui génère un duplicata mais insère les autres???
Ou encore mieux: à chaque fois que tu rencontres un duplicata laisse tomber l'enregistrement qui le génère, mais insère les autres. :??:

Reply

Marsh Posté le 23-07-2008 à 06:24:19   

Reply

Marsh Posté le 23-07-2008 à 08:13:36    

mysql>
 INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c+1;

Reply

Marsh Posté le 23-07-2008 à 09:05:58    

Essaie ceci
Le principe : j'insère si l'enregistrement n'existe pas ;-)
 
 
INSERT INTO observations  
 (date, c_nom, commentaires, p_nom)  
SELECT  
 r.date,  
 r.c_nom,  
 r.commentaires,  
 r.p_nom  
FROM reunion r
where not exists  
(select 'NobodyLoveMe' from observations o
where  
 o.date = r.date
 and o.c_nom = r.c_nom  
 and o.commentaires =  r.commentaires
 and o.p_nom = r.p_nom)
 


Message édité par vttman2 le 23-07-2008 à 09:06:20

---------------
il n'y a pas que le VTT dans la vie, il y a le Snowboard aussi ...
Reply

Marsh Posté le 23-07-2008 à 09:09:13    

sankukai8 si ça ça marche !?
 
... c'est que je viens d'apprendre quelquechose ce matin ;-)


---------------
il n'y a pas que le VTT dans la vie, il y a le Snowboard aussi ...
Reply

Marsh Posté le 23-07-2008 à 09:19:54    

vttman2 a écrit :

sankukai8 si ça ça marche !?
 
... c'est que je viens d'apprendre quelquechose ce matin ;-)


 
ben vi ca marche, je l'utilise regulierement avec Mysql 5
 
regarde la:
 
http://dev.mysql.com/doc/refman/5.0/fr/insert.html


Message édité par sankukai8 le 23-07-2008 à 09:21:13
Reply

Marsh Posté le 23-07-2008 à 09:28:37    

Eh sankukai8, je mettais vraiment pas en doute
tes propos !
 
je connaissais pas c'est tout ...
 
 


---------------
il n'y a pas que le VTT dans la vie, il y a le Snowboard aussi ...
Reply

Marsh Posté le 23-07-2008 à 09:30:41    

vttman2 a écrit :

Eh sankukai8, je mettais vraiment pas en doute
tes propos !
 
je connaissais pas c'est tout ...
 
 


pas de pb

Reply

Marsh Posté le 23-07-2008 à 19:44:14    


Merci sankukai8 et vttman2 pour votre aide, j'adapte et je test. :)  
Je vais commencer avec la solution de sankukai8.
Celle de vttman2 paraît mieux correspondre à mes besoins ("principe : j'insère si l'enregistrement n'existe pas " ), mais je ne comprends pas à quoi correspond 'NobodyLoveMe'.
Pourrais-tu m'éclairer s'il te plait?

Reply

Marsh Posté le 23-07-2008 à 20:20:55    

Il a mis un texte au bolle, comme "foobar"

Reply

Marsh Posté le 24-07-2008 à 09:30:23    

Bonjour,
Puisque tu travail en PHP, fait un contrôle en PHP.
Fait d'abord un select count(*) as exist from observation where c_nom ='ta valeur1' and p_nom='ta valeur2'
 
et ensuite tu test si exist et = 0.
Si oui tu insert sinon l'enregistrement existe déjà.
 
Mais après avoir lu le poste de sankukai8, il est vrai que dans le cas d'une utilisation de MySQL cela parait sympas.


---------------
Tout à commencé par un rêve...
Reply

Marsh Posté le 24-07-2008 à 09:30:23   

Reply

Marsh Posté le 24-07-2008 à 13:29:01    

stef_dobermann a écrit :

Bonjour,
Puisque tu travail en PHP, fait un contrôle en PHP.
Fait d'abord un select count(*) as exist from observation where c_nom ='ta valeur1' and p_nom='ta valeur2'
 
et ensuite tu test si exist et = 0.
Si oui tu insert sinon l'enregistrement existe déjà.
 


 
ce qui implique que tu as correctement transactionné le tout et que tu t'assures que personne n'est allé insérer une telle ligne dans ta table entre ton check et ton insert ...
 
c'est à la bdd de faire ça de manière générale, la contrainte est sur ton modèle ...

Reply

Marsh Posté le 25-07-2008 à 15:18:55    

HappyHarry a écrit :


 
ce qui implique que tu as correctement transactionné le tout et que tu t'assures que personne n'est allé insérer une telle ligne dans ta table entre ton check et ton insert ...
 
c'est à la bdd de faire ça de manière générale, la contrainte est sur ton modèle ...


Bonjour  :hello:  
Merci à tous pour votre aide précieuse, j'ai finalement réussi à utiliser la solution de sankukai8. :D  
A bientôt sur le forum :jap:  
 
PS:Comment fait-on pour marquer le sujet comme résolu?


Message édité par boudzan2008 le 25-07-2008 à 15:20:16
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed