Ето примери за премахване на дублиращи се редове от таблица в MariaDB, когато тези редове имат първичен ключ или колона с уникален идентификатор.
Примерите изтриват дублиращи се редове, но запазват един. Така че в случай на два еднакви реда, той изтрива един от тях и запазва другия.
Примерни данни
Нашите примери използват следните данни:
SELECT * FROM Dogs;
Резултат:
+-------+-----------+----------+ | DogId | FirstName | LastName | +-------+-----------+----------+ | 1 | Bark | Smith | | 2 | Bark | Smith | | 3 | Woof | Jones | | 4 | Ruff | Robinson | | 5 | Wag | Johnson | | 6 | Wag | Johnson | | 7 | Wag | Johnson | +-------+-----------+----------+
Виждаме, че първите два реда са дублирани, както и последните три реда.
DogId
колоната съдържа уникални стойности (защото е първичен ключ на таблицата) и следователно, строго погледнато, няма дубликати. Но в ситуации от реалния живот често ще искате да премахнете фалшивите таблици, които съдържат първични ключове. Следователно в тази статия игнорираме първичния ключ и откриваме дублиращи се стойности в останалите колони.
Опция 1
Нека започнем нашата първа опция, като изберете всички редове, които ще бъдат изтрити:
SELECT * FROM Dogs
WHERE DogId IN (
SELECT DogId FROM Dogs
EXCEPT SELECT MIN(DogId) FROM Dogs
GROUP BY FirstName, LastName
);
Резултат:
+-------+-----------+----------+ | DogId | FirstName | LastName | +-------+-----------+----------+ | 2 | Bark | Smith | | 6 | Wag | Johnson | | 7 | Wag | Johnson | +-------+-----------+----------+
За да премахнем тези дублиращи се редове, можем да превключим SELECT *
до DELETE
:
DELETE FROM Dogs
WHERE DogId IN (
SELECT DogId FROM Dogs
EXCEPT SELECT MIN(DogId) FROM Dogs
GROUP BY FirstName, LastName
);
Резултат:
Query OK, 3 rows affected (0.017 sec)
И за да проверим резултата, можем да изберем всички останали редове в таблицата:
SELECT * FROM Dogs;
Резултат:
+-------+-----------+----------+ | DogId | FirstName | LastName | +-------+-----------+----------+ | 1 | Bark | Smith | | 3 | Woof | Jones | | 4 | Ruff | Robinson | | 5 | Wag | Johnson | +-------+-----------+----------+
Алтернативно можем да използваме MAX()
функция вместо MIN()
функция за промяна на кои редове се изтриват.
Опция 2
В този пример ще приемем, че таблицата е възстановена в първоначалното си състояние (с дубликатите).
Можем да използваме следната заявка, за да проверим за дублиращи се редове:
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
);
Резултат:
+-------+-----------+----------+-------+-----------+----------+ | DogId | FirstName | LastName | DogId | FirstName | LastName | +-------+-----------+----------+-------+-----------+----------+ | 2 | Bark | Smith | 1 | Bark | Smith | | 7 | Wag | Johnson | 5 | Wag | Johnson | | 7 | Wag | Johnson | 6 | Wag | Johnson | +-------+-----------+----------+-------+-----------+----------+
И можем да променим тази заявка, за да изтрием дубликатите:
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
)
);
Резултат:
Query OK, 3 rows affected (0.075 sec)
Таблицата вече е премахната.
Можем да проверим това, като изберем отново всички редове:
SELECT * FROM Dogs;
Резултат:
+-------+-----------+----------+ | DogId | FirstName | LastName | +-------+-----------+----------+ | 1 | Bark | Smith | | 3 | Woof | Jones | | 4 | Ruff | Robinson | | 5 | Wag | Johnson | +-------+-----------+----------+
Можем да използваме MAX()
вместо MIN()
за да изтриете останалите редове от дубликатите, ако предпочитате.