MySQL: таблица Alter IGNORE дает " нарушение ограничения целостности"

Я пытаюсь удалить дубликаты из таблицы MySQL, используя ALTER IGNORE TABLE + уникальный ключ. Документация MySQL говорит:

IGNORE-это расширение MySQL для стандартного SQL. Он управляет работой ALTER TABLE, если в новой таблице имеются дубликаты уникальных ключей или предупреждения при включении строгого режима. Если параметр IGNORE не указан, копия прерывается и откатывается при возникновении ошибок с повторяющимся ключом. Если указан параметр IGNORE, используется только первая строка строки с дубликатами на уникальном ключе. Другие конфликтующие строки удаляются. Неправильные значения усекаются до ближайшего приемлемого значения соответствия.

когда я запускаю запрос ...

ALTER IGNORE TABLE table ADD UNIQUE INDEX dupidx (field)

... Я все еще получаю ошибку #1062-дубликат записи "blabla" для ключа "dupidx".

3 ответов


на IGNORE расширение ключевого слова для MySQL, похоже, имеет ошибка в версии InnoDB на какой-то версии MySQL.

вы всегда можете конвертировать в MyISAM, игнорировать-добавить индекс, а затем конвертировать обратно в InnoDB

ALTER TABLE table ENGINE MyISAM;
ALTER IGNORE TABLE table ADD UNIQUE INDEX dupidx (field);
ALTER TABLE table ENGINE InnoDB;

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


или попробуйте установить сеанс old_alter_table=1 (Не забудьте установить его обратно!)

см.: http://mysqlolyk.wordpress.com/2012/02/18/alter-ignore-table-add-index-always-give-errors/


проблема в том, что у вас есть дубликаты данных в поле, которое вы пытаетесь индексировать. Перед добавлением уникального индекса необходимо удалить дубликаты-нарушители.

один из способов сделать следующее:

   CREATE TABLE tmp_table LIKE table;
   ALTER IGNORE TABLE tmp_table ADD UNIQUE INDEX dupidx (field);
   INSERT IGNORE INTO tmp_table SELECT * FROM table;
   DROP TABLE table;
   RENAME TABLE tmp_table TO table;

это позволяет вставлять в таблицу только уникальные данные