Poniższy przykład usuwa zduplikowane wiersze w MySQL, ignorując klucz podstawowy lub kolumnę unikatowego identyfikatora.
Przykład usuwa zduplikowane wiersze, ale zachowuje jeden. Czyli w przypadku dwóch identycznych wierszy usuwa jeden z nich i zachowuje drugi.
Przykładowe dane
Załóżmy, że mamy tabelę z następującymi danymi:
SELECT * FROM Dogs;
Wynik:
+---------+-------------+------------+ | DogId | FirstName | LastName | |---------+-------------+------------| | 1 | Bark | Smith | | 2 | Bark | Smith | | 3 | Woof | Jones | | 4 | Ruff | Robinson | | 5 | Wag | Johnson | | 6 | Wag | Johnson | | 7 | Wag | Johnson | +---------+-------------+------------+
Widzimy, że pierwsze dwa wiersze są duplikatami, a ostatnie trzy wiersze są duplikatami.
Znajdź duplikaty
Najpierw wybierzmy sprawdź naszą tabelę, aby zobaczyć, ile wierszy jest duplikatami:
SELECT
FirstName,
LastName,
COUNT(*) AS Count
FROM Dogs
GROUP BY FirstName, LastName
HAVING COUNT(*) > 1;
Wynik:
+-----------+----------+-------+ | FirstName | LastName | Count | +-----------+----------+-------+ | Bark | Smith | 2 | | Wag | Johnson | 3 | +-----------+----------+-------+
Widzimy, że są dwa rzędy z Barkiem Smithem i trzy rzędy z Wagiem Johnsonem.
Zdeduplikujemy tabelę tak, aby zawierała tylko jedną z nich.
Usuń duplikaty
Uruchomienie następującego kodu deduplikuje powyższą tabelę:
DELETE d1 FROM Dogs d1
INNER JOIN Dogs d2
WHERE
d1.DogId < d2.DogId AND
d1.FirstName = d2.FirstName AND
d1.LastName = d2.LastName;
Wynik:
Query OK, 3 rows affected (0.00 sec)
Zobaczmy wynik:
SELECT * FROM Dogs;
Wynik:
+-------+-----------+----------+ | DogId | FirstName | LastName | +-------+-----------+----------+ | 2 | Bark | Smith | | 3 | Woof | Jones | | 4 | Ruff | Robinson | | 7 | Wag | Johnson | +-------+-----------+----------+
Pomyślnie usunęliśmy zduplikowane wiersze z tabeli.