(modifié le 16 décembre 2014 à 1:22)

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 :

[sql]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)
);[/sql]

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) :

[sql]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);[/sql]

Vérifions que les champs soient bien présents dans la base :

[sql]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 |
+----+--------+---------+------+---------------------+
[/sql]

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 :

[sql]ALTER IGNORE TABLE membre ADD UNIQUE INDEX(nom,prenom);
Query OK, 4 rows affected (0.46 sec)
Records: 4  Duplicates: 1  Warnings: 0[/sql]

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 :

[sql]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)[/sql]

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 :

[sql]ALTER TABLE membre DROP INDEX nom;
Query OK, 3 rows affected (0.38 sec)
Records: 3  Duplicates: 0  Warnings: 0[/sql]

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é.

J'ajoute un lien venant de chez Developpez pour compléter ce tutoriel.

Auteur : Mr Xhark

Fondateur du blog et passionné par les nouvelles techno, suivez-moi sur twitter