Une base de donnée bien pensée dès le départ n’est pas censée contenir de doublons, mais comme l’erreur est humaine, je vous propose une méthode de suppression de vos doublons MySQL.
Création de la table
Pour l’exemple je vous propose de créer une table ‘membre’ simple :
CREATE TABLE membre ( id int(10) NOT NULL AUTO_INCREMENT, nom varchar(30), prenom varchar(30), age int(3), datecreation timestamp NOT NULL default CURRENT_TIMESTAMP, PRIMARY KEY (id) );
Nous admettrons que l’unicité est basée sur la composition du nom et prénom, c’est à dire que deux personnes physiquement différentes ne peuvent avoir le même couple de nom+prénom (ce qui dans la réalité n’est bien sûr pas valable).
Insertion de champs avec un doublon
Insérons 4 champs, les deux premiers étant identiques (doublons) :
INSERT INTO membre (nom,prenom,age) values ('durand','marc',34);
INSERT INTO membre (nom,prenom,age) values ('durand','marc',34);
INSERT INTO membre (nom,prenom,age) values ('hurni','michael',22);
INSERT INTO membre (nom,prenom,age) values ('morin','luc',52);
Vérifions que les champs soient bien présents dans la base :
SELECT * FROM membre; +----+--------+---------+------+---------------------+ | id | nom | prenom | age | datecreation | +----+--------+---------+------+---------------------+ | 1 | durand | marc | 34 | 2008-11-21 20:16:57 | | 2 | durand | marc | 34 | 2008-11-21 20:16:57 | | 3 | hurni | michael | 22 | 2008-11-21 20:16:57 | | 4 | morin | luc | 52 | 2008-11-21 20:16:57 | +----+--------+---------+------+---------------------+
Nous observons que Marc Durand est bien en double dans la base de données, il y a donc un doublon (en admettant qu’il n’y ait qu’un seul Marc Durand sur terre).
Création d’un index d’unicité
Cet index va permettre de supprimer les enregistrements comportant certains champs identiques, nom et prénom pour mon cas :
ALTER IGNORE TABLE membre ADD UNIQUE INDEX(nom,prenom); Query OK, 4 rows affected (0.46 sec) Records: 4 Duplicates: 1 Warnings: 0
MySQL nous indique qu’un doublon a été supprimé (duplicate).
Interrogation de la table
Vérifions que le deuxième ‘Marc Durand’ n’est plus dans la table :
select * from membre; +----+--------+---------+------+---------------------+ | id | nom | prenom | age | datecreation | +----+--------+---------+------+---------------------+ | 1 | durand | marc | 34 | 2008-11-21 20:16:57 | | 3 | hurni | michael | 22 | 2008-11-21 20:16:57 | | 4 | morin | luc | 52 | 2008-11-21 20:16:57 | +----+--------+---------+------+---------------------+ 3 rows in set (0.00 sec)
L’enregistrement ayant pour identifiant ’2′ a bien été supprimé.
Suppression de l’index
Si vous ne souhaitez pas préserver cet d’unicité, bien qu’il interdise les doublons à l’insertion, vous pouvez le supprimer :
ALTER TABLE membre DROP INDEX nom; Query OK, 3 rows affected (0.38 sec) Records: 3 Duplicates: 0 Warnings: 0
Vérification de la structure en ligne de commande :
desc membre; +--------------+-------------+------+-----+-------------------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------------+-------------+------+-----+-------------------+----------------+ | id | int(10) | NO | PRI | NULL | auto_increment | | nom | varchar(30) | YES | MUL | NULL | | | prenom | varchar(30) | YES | | NULL | | | age | int(3) | YES | | NULL | | | datecreation | timestamp | NO | | CURRENT_TIMESTAMP | | +--------------+-------------+------+-----+-------------------+----------------+ 5 rows in set (0.07 sec)
Conclusion
Il existe plusieurs techniques de suppression des doublons MySQL, les plus mauvaises étant celles préconisant l’usage d’un langage tiers (php, bash, etc.) basées sur un parcours en boucle de la table car trop consommatrices en ressources. Sachez qu’il est bien plus rentable d’utiliser les fonctions natives du moteur SQL, quitte à faire fonctionner un tant soit peu ses méninges et consulter la documentation MySQL (ou autre moteur SQL suivant celui utilisé
). Cette solution étant rapide et fiable, j’espère que vous en aurez l’utilité.
Auteur : Mr Xhark
Fondateur du blog et passionné par les technologies je partage mes découvertes quotidiennement.

(15 vote(s), moy. : 







Déjà 12 commentaires
22 novembre 2008 à 12h11
Ah ca ca me plait ! Vraiment un très bon billet ! Quand tu veux pour un nouveau tuto sur SQL (domaine que je ne maitrise pas vraiment)
22 novembre 2008 à 14h53
@Julien : si jamais tu luttes sur un point précis je peux éventuellement en faire un tuto
J’essaierai de faire d’autres billets prochainement
6 mars 2009 à 17h32
super astuce Merci Beaucoup
29 avril 2009 à 11h31
Très bonne idée. Merci.
11 mai 2009 à 11h16
Merci pour l’astuce, très pratique ce petit « IGNORE »
Avec les 76 secondes de traitement, ça m’a éviter bien des soucis
19 juin 2009 à 4h26
très bien, cette ligne de script MySQL, qui complète le script PHP interdisant l’écriture de données déjà présentes dans la base.
7 décembre 2009 à 15h05
1.750.000 entrées dans ma base de données… Du ménage à faire, et voilà LA solution. Merci beaucoup pour ce coup de pouce.
4 janvier 2010 à 15h57
Un grand merci !
2 juin 2010 à 16h04
Excellent petit tutoriel, en plus au contraire de certains ça marche.
Merci.
8 juin 2010 à 18h01
Intéressant,
mais quid des contraintes d’intégrités ?
Si l’enregistrement ayant pour identifiant ‘2′ est utilisé dans une autre table,
on a perdu des données…
10 octobre 2011 à 21h37
[...] c'est google qui me vient en aide : comment… supprimer… doublons… table… mysql… Je trouve une réponse digne de ce nom et m'empresse de la mettre en [...]
18 janvier 2012 à 23h40
Merci bcp ça marche impec si quelqu’un besion d’aide je suis disponible.