Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1242 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [SQL]Insertion d'un enregistrement sans doublon

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[SQL]Insertion d'un enregistrement sans doublon

n°1699025
mv1
Posté le 07-03-2008 à 16:52:19  profilanswer
 

Bonjour,
 
Voici la structure d'une de mes tables dans MySQL :

mysql> describe my_semaphores;
+-----------+-------------+------+-----+---------+----------------+
| Field     | Type        | Null | Key | Default | Extra          |
+-----------+-------------+------+-----+---------+----------------+
| ID        | int(11)     | NO   | PRI | NULL    | auto_increment |
| ID_CLIENT | int(11)     | NO   |     | 0       |                |
| SEMAPHORE | varchar(30) | NO   | MUL |         |                |
+-----------+-------------+------+-----+---------+----------------+
3 rows in set (0.20 sec)


Plusieurs process/threads sont susceptibles de vouloir insérer des enregistrements où le champ SEMAPHORE peut être identique mais le champ ID_CLIENT différent.
Par exemple : INSERT INTO `MY_SEMAPHORES` (`ID_CLIENT`,`SEMAPHORE`) VALUES (1234,'tartampion'); pour un thread et la même chose pour un autre thread avec juste l'id_client différent.
Seul le 1234 serait différent suivant le thread.
 
Ce que je souhaite c'est qu'il ne reste qu'un seul enregistrement au final (pas de doublon de 'tartampion' avec l'un ou l'autre des ID_CLIENTS).
 
Je ne peux ni utiliser LOCK TABLES (car les autres threads souhaitant travailler sur d'autres enregistrements doivent pouvoir le faire) ni GET_LOCK (car j'ai déjà un verrou posé et utilisé) ... Je ne sais pas comment faire ...
 
Existe-t'il une solution bateau dans MySQL que je ne connaitrai pas, ou quelqu'un saurait-il comment modifier mon INSERT pour être sur d'obtenir le résultat souhaité ?
 
Merci bien !!

mood
Publicité
Posté le 07-03-2008 à 16:52:19  profilanswer
 

n°1699083
mv1
Posté le 07-03-2008 à 18:07:37  profilanswer
 

Premier élément de réponse ... je laisse créer les doublons, et ensuite je réalise une suppression :

mysql> delete from my_semaphores my_sem where my_sem.id > ANY (SELECT id from my_semaphores my_sem2 where my_sem.id <> my_sem2.id and my_sem.semaphore = my_sem2.semaphore);


Malheureusement, ça me génère une erreur :
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where my_sem.id > ANY (SELECT id from my_semaphores my_sem2 where my_sem.id <> m' at line 1
Si je remplace "delete" par "select *", j'obtiens bien la selection des doublons en trop ...
 
Je n'arrive pas à voir où est l'erreur ... Merci pour vos lumières !!!  :jap:

n°1701840
ragondin
Un pote ragondin c'est cool
Posté le 13-03-2008 à 16:10:26  profilanswer
 

pk pas un index unique entre les champs  ID_CLIENT et SEMAPHORE ?


---------------
Pays et country_code traduits : https://www.iso-country-code.com
n°1701853
anapajari
s/travail/glanding on hfr/gs;
Posté le 13-03-2008 à 16:20:38  profilanswer
 

+1  
tu pourras ensuite utiliser replace


---------------
Software and cathedrals are much the same - first we build them, then we pray.
n°1701970
mv1
Posté le 13-03-2008 à 18:21:33  profilanswer
 

ragondin a écrit :

pk pas un index unique entre les champs  ID_CLIENT et SEMAPHORE ?


J'ai déjà un champ `ID`qui est clé unique. Je ne peux pas en créer un deuxième ...... si ?  :??:  
 

Citation :

+1  
tu pourras ensuite utiliser replace


Tout a fait d'accord avec toi si je peux mettre en place la proposition de ragondin !
 
 
Pour le moment, je laisse créer les doublons puis j'envoi deux requêtes qui les suppriment en laissant seulement le plus ancien :

SELECT MIN(`ID`) as `minID` FROM `MY_SEMAPHORES` WHERE `SEMAPHORE`='leSemaphore';
DELETE FROM `MY_SEMAPHORES` WHERE `SEMAPHORE`='leSemaphore' AND `ID`>minID


 
Si la procédure de ragondin est finallement faisable, je ne vois pas pour autant comment définir ma table dans ce sens ...
Quel "CREAT TABLE" dois-je effectuer ?
 
Merci encore pour votre aide !! :jap:

n°1702555
ragondin
Un pote ragondin c'est cool
Posté le 14-03-2008 à 16:16:47  profilanswer
 

Pas de problème pour créer 2 index.

Code :
  1. ALTER TABLE `my_semaphores` ADD UNIQUE (
  2. `ID_CLIENT` ,
  3. `SEMAPHORE`
  4. )


---------------
Pays et country_code traduits : https://www.iso-country-code.com

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [SQL]Insertion d'un enregistrement sans doublon

 

Sujets relatifs
[SQL MS.Access] TOP10 par catégorieConseil sur gestion de la BDD [SQL]
C# -- Problème d'éxécution de requête sur la base SQL serverinsertion d'une image dynamique dans un pdf
Insertion de ligne automatique excel...[résolu] Problème sur formulaire, enregistrement dans BD
aide pour programmer en PL/SQL[Requêtes SQL] Base(OpenOffice) VS Access(Microsoft)
Jointures SQL pour limiter accèsMenu deroulant plusieurs niveaux, à selectionner par SQL
Plus de sujets relatifs à : [SQL]Insertion d'un enregistrement sans doublon


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR