sql >> Database teknologi >  >> RDS >> Mysql

MySQL Fjern Duplicate Records

Nogle gange skal du muligvis fjerne duplikerede poster eller slette duplikerede rækker i MySQL. Der er hovedsageligt 3 måder at slette duplikerede poster i MySQL. Sådan fjerner du duplikerede poster i MySQL.

MySQL Remove Duplicate Records

Her er trinene til at fjerne duplikerede poster i MySQL. Lad os sige, at du har følgende tabel dup_orders(id, amount) med duplikerede poster.

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 |
+------+--------+

Bonus Læs:Sådan får du duplikerede poster i MySQL

Sådan sletter du dublerede rækker i MySQL

Lad os se på hver af de 3 måder at slette duplikerede poster i MySQL.

1. Fjern duplikerede poster ved hjælp af mellemtabel

Denne metode involverer 3 trin. Først skal du vælge rækker uden dubletter fra dup_orders bord og indsæt dem i en anden tabel. Her er syntaksen for det.

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

Her er vores forespørgsel om at vælge forskellige rækker fra dup_orders til en anden tabel.

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 |
+------+--------+

Ovenstående forespørgsel fjerner rækker, der fuldfører duplikat, dvs. dublerede værdier for alle kolonner.

Hvis du vil fjerne rækker med duplikerede værdier for kun en eller flere, men ikke alle kolonner, kan du bruge en GROUP BY-klausul i ovenstående forespørgsel. Hvis du f.eks. kun vil have rækker med dublerede ID-kolonneværdier i din tabel, skal du bruge følgende forespørgsel.

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 |
+------+--------+

Når du har oprettet den mellemliggende tabel, skal du slippe den oprindelige tabel.

mysql> drop table dup_orders;

Til sidst skal du omdøbe mellemtabel til originaltabel.

mysql> alter table dup_orders_copy rename to dup_orders;

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

Bonuslæser:MySQL Tilføj Unik Constaint

2. Fjern duplikerede rækker ved hjælp af INNER JOIN

Du kan også fjerne duplikerede rækker ved at bruge en kombination af DELETE- og INNER JOIN-sætninger. Men i dette tilfælde skal din tabel have mindst én unik kolonne (f.eks. primærnøgle). Lad os sige, at du har følgende dup_orders tabel med dublet beløb værdier, men unikt id værdier.

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 |
+------+--------+

Du kan tilslutte ovenstående tabel med sig selv ved hjælp af en INNER JOIN og slette dublerede rækker ved hjælp af følgende forespørgsel.

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 |
+------+--------+

Ovenstående forespørgsel vil beholde rækkens højeste id for hver dubletrække. Hvis du vil beholde rækken med laveste id, skal du bruge følgende forespørgsel.

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

Bonus Læs:MySQL Omdøb kolonne

3. Fjern duplikerede poster ved hjælp af ROW_NUMBER()

Du kan også fjerne duplikerede poster fra tabellen ved hjælp af ROW_NUMBER()-funktionen, tilgængelig siden 8.0.2. Her er SQL-forespørgslen for at få rækkenumre af duplikerede rækker

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

Her er forespørgslen for at få rækkenummer til dup_orders-tabellen

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

Vi vil bruge dette som en underforespørgsel i vores SQL-forespørgsel til at slette duplikerede rækker, som vist nedenfor

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
)

Forhåbentlig kan du nu nemt fjerne duplikerede poster i MySQL.

Ubiq gør det nemt at visualisere data på få minutter og overvåge i dashboards i realtid. Prøv det i dag!

  1. Wordpress Fatal fejl:Ufanget fejl:Kald til udefineret funktion mysql_connect() i /wp-includes/wp-db.php:1570

  2. Er det muligt for SQL Output-sætning at returnere en kolonne, der ikke er indsat?

  3. Android ListView:hvordan undgår man databaseforespørgsel i bindView()? Skal hente en til mange relationsdata

  4. Forståelse af de 3 nøglekarakteristika ved Big Data