Мне пришлось сделать это недавно в Oracle , но шаги были бы такими же в MySQL. Было много данных, по крайней мере, по сравнению с тем, с чем я привык работать, поэтому мой процесс дедупликации был сравнительно тяжелым. Я включил это здесь на случай, если кто-то еще столкнется с подобной проблемой.
Мои дублированные записи имели разные идентификаторы, разные updated_at
раз, возможно разные updated_by
идентификаторы, но все остальные столбцы одинаковы. Я хотел сохранить самые последние обновления любого дублированного набора.
Для этого я использовал комбинацию логики Rails и SQL.
Шаг первый: запустить сценарий граблей, чтобы идентифицировать идентификаторы дубликатов записей, используя логику модели. Идентификаторы идут в текстовом файле.
Шаг второй: создать временную таблицу с одним столбцом, идентификаторы для удаления, загруженные из текстового файла.
Шаг третий: создайте еще одну временную таблицу со всеми записями, которые я собираюсь удалить (на всякий случай!).
CREATE TABLE temp_duplicate_models
AS (SELECT * FROM models
WHERE id IN (SELECT * FROM temp_duplicate_ids));
Шаг четвертый: фактическое удаление.
DELETE FROM models WHERE id IN (SELECT * FROM temp_duplicate_ids);