Czasami może być konieczne usunięcie zduplikowanych rekordów lub usunięcie zduplikowanych wierszy w MySQL. Istnieją głównie 3 sposoby usuwania zduplikowanych rekordów w MySQL. Oto jak usunąć zduplikowane rekordy w MySQL.
MySQL Usuń zduplikowane rekordy
Oto kroki, aby usunąć zduplikowane rekordy w MySQL. Załóżmy, że masz następującą tabelę dup_orders(id, number) ze zduplikowanymi rekordami.
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 | +------+--------+
Przeczytaj bonus:Jak uzyskać zduplikowane rekordy w MySQL
Jak usunąć zduplikowane wiersze w MySQL
Przyjrzyjmy się każdemu z 3 sposobów usuwania zduplikowanych rekordów w MySQL.
1. Usuń zduplikowane rekordy za pomocą tabeli pośredniej
Ta metoda obejmuje 3 kroki. Najpierw wybierz wiersze bez duplikatów z dup_orders tabeli i wstaw je do innej tabeli. Oto jego składnia.
CREATE TABLE [copy_of_source] SELECT DISTINCT [columns] FROM [source_table];
Oto nasze zapytanie, aby wybrać różne wiersze z dup_orders do innej tabeli.
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 | +------+--------+
Powyższe zapytanie usuwa wiersze, które uzupełniają duplikaty, czyli zduplikowane wartości dla wszystkich kolumn.
Jeśli chcesz usunąć wiersze ze zduplikowanymi wartościami tylko dla jednej lub więcej, ale nie wszystkich kolumn, możesz użyć klauzuli GROUP BY w powyższym zapytaniu. Na przykład, jeśli chcesz tylko wiersze ze zduplikowanymi wartościami kolumn identyfikatora w tabeli, użyj następującego zapytania.
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 | +------+--------+
Po utworzeniu tabeli pośredniej usuń oryginalną tabelę.
mysql> drop table dup_orders;
Na koniec zmień nazwę tabeli pośredniej na oryginalną.
mysql> alter table dup_orders_copy rename to dup_orders; mysql> select * from dup_orders; +------+--------+ | id | amount | +------+--------+ | 1 | 100 | | 2 | 350 | +------+--------+
Przeczytaj bonus:MySQL Dodaj unikatowe ograniczenie
2. Usuń zduplikowane wiersze za pomocą INNER JOIN
Możesz również usunąć zduplikowane wiersze, używając kombinacji instrukcji DELETE i INNER JOIN. Jednak w tym przypadku Twoja tabela musi mieć co najmniej jedną unikatową kolumnę (np. klucz podstawowy). Załóżmy, że masz następujące dup_orders tabela ze zduplikowaną kwotą wartości, ale unikalny id wartości.
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 | +------+--------+
Możesz połączyć powyższą tabelę ze sobą za pomocą INNER JOIN i usunąć zduplikowane wiersze za pomocą następującego zapytania.
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 | +------+--------+
Powyższe zapytanie zachowa najwyższy identyfikator wiersza dla każdego zduplikowanego wiersza. Jeśli chcesz zachować wiersz o najniższym identyfikatorze, użyj następującego zapytania.
mysql> DELETE t1 FROM dup_orders t1 INNER JOIN dup_orders t2 WHERE t1.id >> t2.id AND t1.amount = t2.amount;
Przeczytaj bonus:kolumna zmiany nazwy MySQL
3. Usuń zduplikowane rekordy za pomocą ROW_NUMBER()
Możesz także usunąć zduplikowane rekordy z tabeli za pomocą funkcji ROW_NUMBER(), dostępnej od 8.0.2. Oto zapytanie SQL, aby uzyskać numery zduplikowanych wierszy
SELECT *. ROW_NUMBER () Over (PARTITION BY [column] ORDER BY [column]) as [row_number_name];
Oto zapytanie, aby uzyskać numer wiersza dla tabeli dup_orders
SELECT *. ROW_NUMBER () Over (PARTITION BY id ORDER BY id) as row_number from dup_orders;
Użyjemy tego jako zapytania podrzędnego w naszym zapytaniu SQL, aby usunąć zduplikowane wiersze, jak pokazano poniżej
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 )
Mamy nadzieję, że teraz możesz łatwo usuwać zduplikowane rekordy w MySQL.
Ubiq ułatwia wizualizację danych w ciągu kilku minut i monitorowanie w pulpitach nawigacyjnych w czasie rzeczywistym. Wypróbuj już dziś!