Oto przykłady usuwania zduplikowanych wierszy z tabeli w MariaDB, gdy te wiersze mają klucz podstawowy lub kolumnę unikatowego identyfikatora.
Przykłady usuwają zduplikowane wiersze, ale zachowują jeden. Czyli w przypadku dwóch identycznych wierszy usuwa jeden z nich i zachowuje drugi.
Przykładowe dane
Nasze przykłady wykorzystują następujące dane:
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, podobnie jak ostatnie trzy wiersze.
DogId
kolumna przechowuje unikalne wartości (ponieważ jest to klucz podstawowy tabeli), a zatem, ściśle mówiąc, nie ma duplikatów. Jednak w rzeczywistych sytuacjach często będziesz chciał usunąć duplikaty tabel zawierających klucze podstawowe. Dlatego w tym artykule ignorujemy klucz podstawowy i wykrywamy zduplikowane wartości w pozostałych kolumnach.
Opcja 1
Zacznijmy naszą pierwszą opcję od zaznaczenia wszystkich wierszy, które zostaną usunięte:
SELECT * FROM Dogs
WHERE DogId IN (
SELECT DogId FROM Dogs
EXCEPT SELECT MIN(DogId) FROM Dogs
GROUP BY FirstName, LastName
);
Wynik:
+-------+-----------+----------+ | DogId | FirstName | LastName | +-------+-----------+----------+ | 2 | Bark | Smith | | 6 | Wag | Johnson | | 7 | Wag | Johnson | +-------+-----------+----------+
Aby usunąć te zduplikowane wiersze, możemy przełączyć SELECT *
do DELETE
:
DELETE FROM Dogs
WHERE DogId IN (
SELECT DogId FROM Dogs
EXCEPT SELECT MIN(DogId) FROM Dogs
GROUP BY FirstName, LastName
);
Wynik:
Query OK, 3 rows affected (0.017 sec)
Aby zweryfikować wynik, możemy zaznaczyć wszystkie pozostałe wiersze w tabeli:
SELECT * FROM Dogs;
Wynik:
+-------+-----------+----------+ | DogId | FirstName | LastName | +-------+-----------+----------+ | 1 | Bark | Smith | | 3 | Woof | Jones | | 4 | Ruff | Robinson | | 5 | Wag | Johnson | +-------+-----------+----------+
Możemy alternatywnie użyć MAX()
funkcja zamiast MIN()
funkcja do zmiany, które wiersze są usuwane.
Opcja 2
W tym przykładzie założymy, że tabela została przywrócona do swojego pierwotnego stanu (z duplikatami).
Do sprawdzenia zduplikowanych wierszy możemy użyć następującego zapytania:
SELECT *
FROM Dogs d1, Dogs d2
WHERE d1.FirstName = d2.FirstName
AND d1.LastName = d2.LastName
AND d1.DogId <> d2.DogId
AND d1.DogId = (
SELECT MAX(DogId)
FROM Dogs d3
WHERE d3.FirstName = d1.FirstName
AND d3.LastName = d1.LastName
);
Wynik:
+-------+-----------+----------+-------+-----------+----------+ | DogId | FirstName | LastName | DogId | FirstName | LastName | +-------+-----------+----------+-------+-----------+----------+ | 2 | Bark | Smith | 1 | Bark | Smith | | 7 | Wag | Johnson | 5 | Wag | Johnson | | 7 | Wag | Johnson | 6 | Wag | Johnson | +-------+-----------+----------+-------+-----------+----------+
Możemy zmodyfikować to zapytanie, aby usunąć duplikaty:
DELETE FROM Dogs WHERE DogId IN (
SELECT d2.DogId
FROM Dogs d1, Dogs d2
WHERE d1.FirstName = d2.FirstName
AND d1.LastName = d2.LastName
AND d1.DogId <> d2.DogId
AND d1.DogId=(
SELECT MIN(DogId)
FROM Dogs d3
WHERE d3.FirstName = d1.FirstName
AND d3.LastName = d1.LastName
)
);
Wynik:
Query OK, 3 rows affected (0.075 sec)
Tabela została usunięta z kopii.
Możemy to zweryfikować, wybierając ponownie wszystkie wiersze:
SELECT * FROM Dogs;
Wynik:
+-------+-----------+----------+ | DogId | FirstName | LastName | +-------+-----------+----------+ | 1 | Bark | Smith | | 3 | Woof | Jones | | 4 | Ruff | Robinson | | 5 | Wag | Johnson | +-------+-----------+----------+
Możemy użyć MAX()
zamiast MIN()
aby usunąć inne wiersze z duplikatów, jeśli jest to preferowane.