Bonjour,
Je rencontre un probleme pour supprimer des boublons dans une table.
Il faut que je conserve 1 enregistrement tout en supprimant les doublons.
Merci de votre aide
Version imprimable
Bonjour,
Je rencontre un probleme pour supprimer des boublons dans une table.
Il faut que je conserve 1 enregistrement tout en supprimant les doublons.
Merci de votre aide
Bonjour,
Il y a d'anciens posts sur ce forum sur le sujet :
http://www.developpez.net/forums/vie...light=doublons
http://www.developpez.net/forums/vie...light=doublons
...
En sql je ne vois pas comment tu pourrais faire par contre tu peut toujours faire un script en php?
Tu peux récupérer tout tes enregistrements triès par la colonne marquant le doublon et tu parcoures ta liste en supprimant les doublons dans la base.
Je ne vois que cette solution :roll:
Maximilian m'a un peu coupé l'herbe sous le pied.
1) Tu créés une table temporaire avec la même structure que ta table original
2) Tu fais un:
Avec dans le GROUP BY tous les champs qui ne sont pas des clefs primaires SAUF si la clef primaire est composée de plusieurs champs (c'est le cas pour les associations), auquel cas tu fais le GROUP BY sur tous les champs.Code:
1
2
3
4 INSERT INTO matable_tmp (SELECT * FROM matable GROUP BY champ1, champ2, ...)
3) Tu supprimes ta table originale (ici matable)
4) Tu renommes ta table temporaire avec le nom de ta table originale (matable_tmp => matable)
cela ne marche pas pour moi...
j'ai cette erreur :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 INSERT INTO t_devis_tmp( SELECT * FROM t_devis GROUP BY devis_id_get HAVING COUNT( * ) >= 1 ) MySQL a répondu: You have an error in your SQL syntax near 'SELECT * FROM t_devis GROUP BY devis_id_get HAVING COUNT( * ) >= 1 ) ' at line 2 Retour
C'est peut-être à cause des parenthèses: MySQL croit que c'est des noms de colonnes (désolé!)
ou:Code:
1
2
3
4 INSERT INTO matable_tmp SELECT * FROM matable GROUP BY champ1, champ2, ...
Code:
1
2
3
4 INSERT INTO matable_tmp (champ1, champ2, ...) SELECT * FROM matable GROUP BY champ1, champ2, ...
Ah oui forcément si on utilise des tables temporaires tout devient plus simple. J'ai éssayé une bonne heure de le faire par requête sans succés. Je voulais pas faire de table temporaire ;)
Dans un autre sujet (celui-là: http://www.developpez.net/forums/viewtopic.php?t=380149), il y a un problème lié à la taille de la base, donc tu ne peux pas te permettre de dupliquer des enregistrements dans une table temporaire (ici ça ne semble pas le cas)
Si l'auteur de l'autre sujet me répond, alors j'explorerai une solution "sur place" pour supprimer les doublons sans utiliser de table temporaire (en utilisant un script), mais par contre ce sera plus lent.
C'est un problème récurrent en informatique:
- aller plus vite, mais en utilisant plus de mémoire
- réduire la taille en mémoire mais en augmentant les temps de calculs
Après, tout dépend du problème à résoudre.
La méthode la plus simple pour supprimer des doublons est de créer un index composite unique, sur les colonnes dont tu veux éviter les doublons.
Exemple: dans ta_table tu veux supprimer toutes les lignes qui présentent les même valeurs pour les colonnes 1, 3 et 5.
Pas besoin de table temporaire. Mysql fait le travail tout seul mais attention, pas de retour en arrière possible! Songe à faire une copie avant.Code:
1
2
3
4
5 #création de l'index unique (IGNORE, pour ignorer les erreurs, est indispensable) ALTER IGNORE TABLE ta_table ADD UNIQUE ton_index (col1, col3, col5) # supression de l'index si superflu ALTER TABLE ta_table DROP INDEX ton_index
Oui mais cela ne tient pas compte de l'utilisation éventuel de ce doublon dans une autre table.
Donc c'est très dangereux