27.04.2020 15:25

Удаление дубликатов в MySQL/MariaDB

Удаление дубликатов в MySQL/MariaDB

В этой статье я объясню, как удалить дубликаты в MySQL/MariaDB. Если вы уже нашли дублирующие записи в вашей базе данных, вам нужно будет удалить их, оставив оригинальную запись. Вы можете выбрать, какую запись оставить: с самым высоким или самым низким идентификатором. Давайте рассмотрим пример того, как удалить повторяющиеся записи в конкретной таблице.

Сначала создадим простую таблицу `emails`:

--
-- Table structure for table `emails`
--
CREATE TABLE IF NOT EXISTS `emails` (
	`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
	`email` VARCHAR(255) NOT NULL,
	PRIMARY KEY (`id`)
);

--
-- Dumping data for table `emails`
--
INSERT INTO `emails` (`email`)
VALUES
	('example@gmail.com'),
	('example2@gmail.com'),
	('example3@gmail.com'),
	('example4@gmail.com'),
	('example@gmail.com'),
	('example@gmail.com'),
	('example@gmail.com'),
	('example2@gmail.com'),
	('example2@gmail.com'),
	('example3@gmail.com');

Используйте следующий запрос для выявления дубликатов:

SELECT `email`, COUNT(`email`) AS countEmail
FROM `emails`
GROUP BY `email`
HAVING countEmail > 1
ORDER BY countEmail DESC;

Если вы хотите удалить дублирующиеся записи и оставить только запись с самым высоким идентификатором, используйте следующий запрос:

DELETE t
FROM `emails` AS t
INNER JOIN `emails` AS t2
WHERE
	t.`email` = t2.`email` AND
	t.`id` < t2.`id`;

Если вы хотите удалить дублирующиеся записи и оставить только запись с самым низким идентификатором, используйте следующий запрос:

DELETE t
FROM `emails` AS t
INNER JOIN `emails` AS t2
WHERE
	t.`email` = t2.`email` AND
	t.`id` > t2.`id`;

В MySQL до версии 5.7 вы могли использовать простое решение для удаления дубликатов, но оно было удалено:

ALTER IGNORE TABLE `emails` ADD UNIQUE INDEX(`email`);

Суть этого решения заключается в том, что при добавлении уникального индекса дубликаты автоматически удаляются и остается только одна первая запись.

Другие статьи