MySQL: ALTER IGNORE TABLE дает "Нарушение ограничения целостности"
Я пытаюсь удалить дубликаты из таблицы MySQL, используя ALTER IGNORE TABLE + UNIQUE KEY. Документация MySQL говорит:
IGNORE - это расширение MySQL для стандартного SQL. Он управляет тем, как работает ALTER TABLE, если в новой таблице есть дубликаты уникальных клавиш или если предупреждения включены, когда включен строгий режим. Если IGNORE не указан, копия прерывается и откатывается, если возникают ошибки с повторяющимися ключами. Если IGNORE указан, для строк с дубликатами на уникальном ключе используется только первая строка. Остальные конфликтующие строки удаляются. Неверные значения усекаются до ближайшего подходящего значения.
Когда я запускаю запрос...
ALTER IGNORE TABLE table ADD UNIQUE INDEX dupidx (field)
... Я все еще получаю сообщение об ошибке # 1062 - Дублировать запись 'blabla' для ключа 'dupidx'.
Ответы
Ответ 1
Расширение ключевого слова IGNORE
для MySQL, похоже, содержит ошибку в версии InnoDB в некоторой версии MySQL.
Вы всегда можете конвертировать в MyISAM, IGNORE-ADD индекс, а затем конвертировать обратно в InnoDB
ALTER TABLE table ENGINE MyISAM;
ALTER IGNORE TABLE table ADD UNIQUE INDEX dupidx (field);
ALTER TABLE table ENGINE InnoDB;
Обратите внимание: если у вас есть ограничения по внешнему ключу, это не сработает, вам придется сначала удалить их и добавить их позже.
Ответ 2
Или попробуйте установить session old_alter_table = 1 (не забудьте установить его обратно!)
Смотрите: http://mysqlolyk.wordpress.com/2012/02/18/alter-ignore-table-add-index-always-give-errors/
Ответ 3
Проблема заключается в том, что у вас есть дубликаты данных в поле, которое вы пытаетесь индексировать. Вам нужно будет удалить дублирующие дубликаты, прежде чем вы сможете добавить уникальный индекс.
Один из способов сделать следующее:
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;
это позволяет вставлять только уникальные данные в таблицу