Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL supprimer les enregistrements en double

Parfois, vous devrez peut-être supprimer des enregistrements en double ou supprimer des lignes en double dans MySQL. Il existe principalement 3 façons de supprimer les enregistrements en double dans MySQL. Voici comment supprimer les enregistrements en double dans MySQL.

MySQL Supprimer les enregistrements en double

Voici les étapes pour supprimer les enregistrements en double dans MySQL. Disons que vous avez le tableau suivant dup_orders(id, amount) avec des enregistrements en double.

mysql> create table dup_orders(id int, amount int);

mysql> insert into dup_orders(id,amount) values(1, 100),(1,250),(2,350),(2,350);

mysql> select * from dup_orders;
+------+--------+
| id   | amount |
+------+--------+
|    1 |    100 |
|    1 |    250 |
|    2 |    350 |
|    2 |    350 |
+------+--------+

Lecture bonus :comment obtenir des enregistrements en double dans MySQL

Comment supprimer les lignes en double dans MySQL

Examinons chacune des 3 façons de supprimer les enregistrements en double dans MySQL.

1. Supprimer les enregistrements en double à l'aide de la table intermédiaire

Cette méthode comporte 3 étapes. Tout d'abord, sélectionnez les lignes sans doublons, à partir de dup_orders table et insérez-les dans une autre table. En voici la syntaxe.

CREATE TABLE [copy_of_source] SELECT DISTINCT [columns] FROM [source_table];

Voici notre requête pour sélectionner des lignes distinctes de dup_orders dans une autre table.

mysql> CREATE TABLE dup_orders_copy SELECT DISTINCT id,amount FROM dup_orders;

mysql> select * from dup_orders_copy;
+------+--------+
| id   | amount |
+------+--------+
|    1 |    100 |
|    1 |    250 |
|    2 |    350 |
+------+--------+

La requête ci-dessus supprime les lignes qui sont complètement en double, c'est-à-dire les valeurs en double pour toutes les colonnes.

Si vous souhaitez supprimer des lignes avec des valeurs en double pour une ou plusieurs colonnes mais pas toutes, vous pouvez utiliser une clause GROUP BY dans la requête ci-dessus. Par exemple, si vous souhaitez uniquement des lignes avec des valeurs de colonne ID en double dans votre table, utilisez la requête suivante.

mysql> CREATE TABLE dup_orders_copy SELECT id,amount FROM dup_orders group by id;

mysql> select * from dup_orders_copy;
+------+--------+
| id   | amount |
+------+--------+
|    1 |    100 |
|    2 |    350 |
+------+--------+

Une fois que vous avez créé la table intermédiaire, supprimez la table d'origine.

mysql> drop table dup_orders;

Enfin, renommez la table intermédiaire en table d'origine.

mysql> alter table dup_orders_copy rename to dup_orders;

mysql> select * from dup_orders;
+------+--------+
| id   | amount |
+------+--------+
|    1 |    100 |
|    2 |    350 |
+------+--------+

Lecture bonus :MySQL ajoute une contrainte unique

2. Supprimez les lignes en double à l'aide de INNER JOIN

Vous pouvez également supprimer les lignes en double à l'aide d'une combinaison d'instructions DELETE et INNER JOIN. Cependant, dans ce cas, votre table doit avoir au moins une colonne unique (par exemple, une clé primaire). Disons que vous avez les dup_orders suivants tableau avec montant en double valeurs mais id unique valeurs.

mysql> insert into dup_orders(id,amount) values(1, 100),(2,250),(3,350),(4,350);

mysql> select * from dup_orders;
+------+--------+
| id   | amount |
+------+--------+
|    1 |    100 |
|    2 |    250 |
|    3 |    350 |
|    4 |    350 |
+------+--------+

Vous pouvez joindre la table ci-dessus avec elle-même à l'aide d'un INNER JOIN et supprimer les lignes en double à l'aide de la requête suivante.

mysql> DELETE t1 FROM dup_orders t1
       INNER JOIN dup_orders t2
       WHERE
           t1.id < t2.id 
           AND t1.amount = t2.amount;
+------+--------+
| id   | amount |
+------+--------+
|    1 |    100 |
|    2 |    250 |
|    4 |    350 |
+------+--------+

La requête ci-dessus conservera l'identifiant le plus élevé de la ligne pour chaque ligne en double. Si vous souhaitez conserver la ligne avec l'identifiant le plus bas, utilisez la requête suivante.

mysql> DELETE t1 FROM dup_orders t1
       INNER JOIN dup_orders t2
       WHERE
           t1.id >> t2.id 
           AND t1.amount = t2.amount;

Lecture bonus :Colonne de renommage MySQL

3. Supprimer les enregistrements en double à l'aide de ROW_NUMBER()

Vous pouvez également supprimer les enregistrements en double de la table à l'aide de la fonction ROW_NUMBER(), disponible depuis la version 8.0.2. Voici la requête SQL pour obtenir les numéros de ligne des lignes en double

SELECT *. ROW_NUMBER () Over (PARTITION BY [column] 
ORDER BY [column]) as [row_number_name];

Voici la requête pour obtenir le numéro de ligne pour la table dup_orders

SELECT *. ROW_NUMBER () Over (PARTITION BY id ORDER BY id) 
as row_number from dup_orders;

Nous l'utiliserons comme sous-requête dans notre requête SQL pour supprimer les lignes en double, comme indiqué ci-dessous

DELETE FROM dup_orders
WHERE id IN (
    SELECT id
    FROM (
        SELECT 
            id, 
            ROW_NUMBER () Over (PARTITION BY id ORDER BY id) as row_number 
           from dup_orders
    ) t
    WHERE row_number > 1
)

Heureusement, vous pouvez désormais supprimer facilement les enregistrements en double dans MySQL.

Ubiq facilite la visualisation des données en quelques minutes et la surveillance dans des tableaux de bord en temps réel. Essayez-le aujourd'hui !