Мне показалось полезным добавить индекс unqiue, используя «ALTER IGNORE», который удаляет дубликаты и вводит уникальные записи, что звучит так, как вы хотели бы. Таким образом, синтаксис будет:
ALTER IGNORE TABLE `table` ADD UNIQUE INDEX(`id`, `another_id`, `one_more_id`);
Это фактически добавляет уникальное ограничение, означающее, что у вас никогда не будет дубликатов записей, а IGNORE удаляет существующие дубликаты.
Подробнее об eh ALTER IGNORE можно прочитать здесь: http://mediakey.dk/~cc/mysql-remove-duplicate-entries/
Обновление: @Inquisitive сообщил мне, что это может не работать в версиях MySql> 5.5:
Сбой в MySQL> 5.5 и в таблице InnoDB, а также в Percona из-за
их функция быстрого создания индекса InnoDB [http://bugs.mysql.com/bug.php?id=40344]. В этом случае
сначала запустите set session old_alter_table=1
, а затем приведенную выше команду
будет работать нормально
Обновление - ALTER IGNORE
Удалено в 5.7
Из документов
Начиная с MySQL 5.6.17, предложение IGNORE устарело и его использование
генерирует предупреждение. IGNORE удален в MySQL 5.7.
Один из разработчиков MySQL дает две альтернативы :
- Группировка по уникальным полям и удаление, как показано выше
- Создайте новую таблицу, добавьте уникальный индекс, используйте
INSERT IGNORE
, например:
CREATE TABLE duplicate_row_table LIKE regular_row_table;
ALTER TABLE duplicate_row_table ADD UNIQUE INDEX (id, another_id);
INSERT IGNORE INTO duplicate_row_table SELECT * FROM regular_row_table;
DROP TABLE regular_row_table;
RENAME TABLE duplicate_row_table TO regular_row_table;
Но, в зависимости от размера вашего стола, это может быть нецелесообразно