Следният пример изтрива дублиращи се редове в MySQL, като игнорира първичния ключ или колоната с уникален идентификатор.
Примерът изтрива дублиращи се редове, но запазва един. Така че в случай на два еднакви реда, той изтрива един от тях и запазва другия.
Примерни данни
Да предположим, че имаме таблица със следните данни:
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 | +---------+-------------+------------+
Можем да видим, че първите два реда са дублирани, а последните три реда са дублирани.
Намерете дубликатите
Първо, нека изберем проверка на нашата таблица, за да видим колко реда са дублирани:
SELECT
FirstName,
LastName,
COUNT(*) AS Count
FROM Dogs
GROUP BY FirstName, LastName
HAVING COUNT(*) > 1;
Резултат:
+-----------+----------+-------+ | FirstName | LastName | Count | +-----------+----------+-------+ | Bark | Smith | 2 | | Wag | Johnson | 3 | +-----------+----------+-------+
Виждаме, че има два реда с Барк Смит и три реда с Уаг Джонсън.
Ще премахнем фалшифицирането на таблицата, така че да съдържа само по един от всеки.
Изтриване на дубликатите
Изпълняването на следния код премахва дублирането на горната таблица:
DELETE d1 FROM Dogs d1
INNER JOIN Dogs d2
WHERE
d1.DogId < d2.DogId AND
d1.FirstName = d2.FirstName AND
d1.LastName = d2.LastName;
Резултат:
Query OK, 3 rows affected (0.00 sec)
Нека видим резултата:
SELECT * FROM Dogs;
Резултат:
+-------+-----------+----------+ | DogId | FirstName | LastName | +-------+-----------+----------+ | 2 | Bark | Smith | | 3 | Woof | Jones | | 4 | Ruff | Robinson | | 7 | Wag | Johnson | +-------+-----------+----------+
Успешно премахнахме дублиращи се редове от таблицата.