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!