2014-11-05 2 views
0

У нас есть эта большая таблица «избранных», и мы столкнулись с проблемой, которая выявила тот факт, что у нас нет уникального ограничения на user, favorite_type и favorite_id. Я сделал миграцию, которая добавит индекс к этим 3, но это не сработает, потому что у нас есть существующие данные с одинаковым набором записей. Там есть и другие данные (updated_at, created_at, id), который отлично проигрывает, но делает его несовершенным.Дедублирующие записи в большой таблице, которые имеют одинаковые значения в нескольких столбцах.

Есть ли способ в рельсах (3.2.x) для этого или способ (my) SQL?

Я знаю, что могу вытащить все из них, затем группировать и сопоставлять удаление всех дополнительных элементов, но это очень большая таблица (1mil +), и мы не можем иметь длительные миграции.

ответ

2

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

CREATE TABLE tableTmp LIKE table; 

Добавьте ограничения, а затем вставьте все записи во временную таблицу.

INSERT INTO tableTmp SELECT * FROM table 

Проверьте данные, а затем опустите и переименуйте.

DROP TABLE table; 
RENAME TABLE tableTmp TO table; 
+0

Хм, это сработает. Я дам вам галочку через день, хочу посмотреть, есть ли у кого-нибудь хитроумный трюк, о котором я не думаю, но у меня есть ощущение, что ваш путь будет лучше. –

Смежные вопросы