Comment MySQL supprime les lignes en double

How Mysql Delete Duplicate Rows



MySQL est un ensemble de données relationnelles qui stocke les données dans des tables comportant des lignes et des colonnes. Cependant, les données stockées dans la base de données peuvent contenir des valeurs en double causées par des erreurs dans les applications ou les utilisateurs.

Dans ce tutoriel, nous allons apprendre à supprimer les lignes en double dans une base de données MySQL pour réduire la taille de la base de données et aider à augmenter les performances du serveur.







Avant de continuer, supposons que :



  1. Vous avez MySQL installé et en cours d'exécution sur votre système
  2. Vous avez un accès root à la base de données.
  3. Vous avez accès à une base de données pour expérimenter ou tester

REMARQUE : Si vous avez besoin d'un exemple de base de données pour essayer les concepts fournis dans ce guide, veuillez considérer la base de données Sakila ou télécharger une copie de la base de données utilisée dans ce guide.



Les ressources sont fournies ci-dessous :





Utilisation de base

Avant de commencer, nous allons créer intentionnellement une table contenant des valeurs en double à des fins de test. Les requêtes SQL pour effectuer cette action sont ci-dessous :

UTILISATION monde;
TOMBER TABLE SI EXISTE utilisateurs;
CRÉER TABLE utilisateurs(identifiant INT CLÉ PRIMAIRE NE PAS NUL INCRÉMENTATION AUTOMATIQUE ,Nom d'utilisateur VARCHAR (dix) NE PAS NUL ,nom et prénom VARCHAR (vingt),e-mail VARCHAR (255) NE PAS NUL );
INSÉRER DANS utilisateurs(Nom d'utilisateur,nom et prénom,e-mail) VALEURS
('Vierge', 'Claude M. Mori', ' [email protégé] '),
('presse', 'Tiffany G. Bailey', ' [email protégé] '),
('fusée', 'Christopher S. Payton', ' [email protégé] '),
('matière noire', 'Patricia J. Fox', ' [email protégé] '),
('matière', 'Faye H. Hartley', ' [email protégé] '),
('matière noire', 'Patricia J. Fox', ' [email protégé] '),
('fusée', 'Christopher S. Payton', ' [email protégé] '),
('artémis', 'Wesley C. Dillard', ' [email protégé] ');

N'hésitez pas à modifier la requête ci-dessus pour l'adapter à vos besoins. Vous devez également vous assurer que la base de données (monde) est créée pour éviter les erreurs.



Maintenant, si nous obtenons toutes les données dans le tableau et dans l'ordre par nom d'utilisateur, nous verrons les doublons que nous avons comme indiqué :

mysql> utilisation monde;
Base de données modifié
mysql> SÉLECTIONNER * DE utilisateurs COMMANDÉ PAR Nom d'utilisateur;
+ ---- + ------------ + ----------------------- + ------- ---------------- +
|identifiant|Nom d'utilisateur|nom et prénom|e-mail|
+ ---- + ------------ + ----------------------- + ------- ---------------- +
| 8 |artémis|Wesley C. Dillard|[email protégé]|
| 4 |matière noire|Patricia J. Fox|[email protégé]|
| 6 |matière noire|Patricia J. Fox|[email protégé]|
| 2 |presse|Tiffany G. Bailey|[email protégé]|
| 5 |matière|Faye H. Hartley|[email protégé]|
| 3 |fusée|Christopher S. Payton|[email protégé]|
| 7 |fusée|Christopher S. Payton|[email protégé]|
| 1 |Vierge|Claude M. Mori|[email protégé]|
+ ---- + ------------ + ----------------------- + ------- ---------------- +

Comme vous pouvez le voir dans le tableau ci-dessus, nous avons deux valeurs en double qui agrandissent la base de données sans raison et entraînent des vitesses lentes.

Voyons maintenant comment nous pouvons supprimer ces valeurs.

#1 – SUPPRIMER LA REJOINDRE

Une façon de supprimer les lignes en double dans une base de données consiste à utiliser l'instruction MySQL DELETE JOIN. La requête, cependant, utilise des identifiants pour supprimer les valeurs en double.

Par exemple, pour supprimer les valeurs en double dans le tableau des utilisateurs ci-dessus, nous pouvons saisir :

EFFACER Tableau 1 DE table des utilisateurs1 INTÉRIEUR REJOINDRE table des utilisateurs2 table1.id<table2.id ET table1.email=table2.email;

Une fois que vous avez exécuté la requête ci-dessus, vous supprimerez les valeurs en double comme indiqué dans la sortie ci-dessous :

mysql> EFFACER Tableau 1 DE table des utilisateurs1 INTÉRIEUR REJOINDRE table des utilisateurs2 table1.id<table2.id ET table1.email=table2.email;
Requête OK, 2lignes affectées(0,01seconde)

mysql> SÉLECTIONNER * DE utilisateurs COMMANDÉ PAR Nom d'utilisateur;
+ ---- + ------------ + ----------------------- + ------- ---------------- +
|identifiant|Nom d'utilisateur|nom et prénom|e-mail|
+ ---- + ------------ + ----------------------- + ------- ---------------- +
| 8 |artémis|Wesley C. Dillard|[email protégé]|
| 6 |matière noire|Patricia J. Fox|[email protégé]|
| 2 |presse|Tiffany G. Bailey|[email protégé]|
| 5 |matière|Faye H. Hartley|[email protégé]|
| 7 |fusée|Christopher S. Payton|[email protégé]|
| 1 |Vierge|Claude M. Mori|[email protégé]|
+ ---- + ------------ + ----------------------- + ------- ---------------- +

#2 – Fonction Row_Number()

La deuxième méthode que nous pouvons implémenter consiste à utiliser la fonction MySQL row_number(). Cette fonction est prise en charge dans MySQL version 8 et supérieure.

Cela fonctionne en attribuant une valeur int séquentielle à chaque ligne, les lignes contenant des valeurs en double obtenant une valeur supérieure à 1.

Pour en savoir plus sur cette fonction, utilisez la ressource fournie ci-dessous :

https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html#function_row-number

Considérez la requête ci-dessous qui renvoie l'ID des lignes avec des valeurs en double :

SÉLECTIONNER identifiant DE ( SÉLECTIONNER identifiant,ROW_NUMBER()PLUS DE( CLOISON PAR nom d'utilisateur COMMANDÉ PAR Nom d'utilisateur) COMME var_ligne DE utilisateurs)t1 var_ligne> 1;

Une fois que vous avez exécuté la requête ci-dessus, vous devriez obtenir la liste des identifiants comme indiqué dans la sortie ci-dessous :

+ ---- +
|identifiant|
+ ---- +
| 6 |
| 7 |
+ ---- +
2Lignes dans ensemble (0,01seconde)

Si vous souhaitez supprimer les valeurs, remplacez simplement l'instruction SELECT par l'instruction DELETE comme indiqué ci-dessous :

EFFACER DE utilisateurs identifiant DANS ( SÉLECTIONNER identifiant DE ( SÉLECTIONNER identifiant,ROW_NUMBER()PLUS DE( CLOISON PAR nom d'utilisateur COMMANDÉ PAR Nom d'utilisateur) COMME var_ligne DE utilisateurs)t1 var_ligne> 1);

Enfin, vous pouvez vérifier que les valeurs en double sont supprimées à l'aide de l'instruction SELECT.

mysql> SÉLECTIONNER * de utilisateurs COMMANDÉ PAR Nom d'utilisateur;
+ ---- + ------------ + ----------------------- + ------- ---------------- +
|identifiant|Nom d'utilisateur|nom et prénom|e-mail|
+ ---- + ------------ + ----------------------- + ------- ---------------- +
| 8 |artémis|Wesley C. Dillard|[email protégé]|
| 4 |matière noire|Patricia J. Fox|[email protégé]|
| 2 |presse|Tiffany G. Bailey|[email protégé]|
| 5 |matière|Faye H. Hartley|[email protégé]|
| 3 |fusée|Christopher S. Payton|[email protégé]|
| 1 |Vierge|Claude M. Mori|[email protégé]|
+ ---- + ------------ + ----------------------- + ------- ---------------- +

Conclusion

Dans ce didacticiel, nous avons discuté des deux méthodes de suppression des valeurs en double d'une base de données. Les bases de données volumineuses, en particulier celles d'usage courant, peuvent contenir de nombreuses valeurs en double provenant d'importations externes et d'autres erreurs. Par conséquent, il est nécessaire de continuer à purger les valeurs en double pour garantir que les applications fonctionnent de manière optimale.