Проблема дубликатов в таблицах — одна из древнейших в SQL, особенно усилившаяся с массовым ростом интернет-сервисов и миграцией больших массивов данных. Поначалу проблему решали вручную: находили дубли однократными скриптами, удаляли их, но по мере роста данных этот подход становился неэффективным.
Проблема: при неаккуратной загрузке, миграции или сбоев зачастую образуются десятки тысяч строк с одинаковыми ключевыми признаками (например, email или паспорт). Это ведет к ошибкам при интеграциях, некорректной аналитике, потере доверия клиентов.
Решение: строить отчёты о дубликатах через группировку и оконные функции; реализовать удаление дублирующих записей с сохранением одной "правильной"; добавить ограничения (UNIQUE) для ключевых полей и обязательное регулярное аудирование.
Пример кода
WITH Duplicates AS ( SELECT email, COUNT(*) AS cnt FROM users GROUP BY email HAVING COUNT(*) > 1 ) SELECT u.* FROM users u JOIN Duplicates d ON u.email = d.email ORDER BY u.email, u.id;
Удаление дубликатов (оставляя строку с минимальным id):
DELETE FROM users WHERE id NOT IN ( SELECT MIN(id) FROM users GROUP BY email );
Ключевые особенности:
Можно ли использовать DISTINCT для удаления дубликатов из таблицы?
Нет, DISTINCT работает только для выборок (SELECT), он не удаляет строки из таблицы. Нужно использовать DELETE или INSERT ... SELECT с DISTINCT для создания новой чистой таблицы.
Удаляет ли команда DELETE ... WHERE id NOT IN (SELECT MIN(id) ...) все дубликаты гарантировано?
Нет, если в ключевом столбце есть NULL, такой запрос может ошибочно оставить дубликаты из-за особенностей сравнения NULL-значений.
Достаточно ли создать UNIQUE INDEX, чтобы больше никогда не было дубликатов?
Нет, индекс защитит только от новых попыток вставки дубликатов, но никак не влияет на уже существующие в таблице повторы.
CRM-система копирует пользователей из разных источников, не учитывая уникальность email, в базе 50000 дубликатов. Массовое добавление UNIQUE-индекса приводит к сбою, сервис простаивает.
Плюсы:
Минусы:
Инженер регулярно анализирует дубликаты через специализированные отчёты, чистит базу, создаёт уникальные индексы. Перед миграцией новых данных делает валидацию.
Плюсы:
Минусы: