MySQL: ALTER IGNORE TABLE выдает «Нарушение ограничения целостности» - PullRequest
47 голосов
/ 08 ноября 2011

Я пытаюсь удалить дубликаты из таблицы 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' .

Ответы [ 3 ]

96 голосов
/ 08 ноября 2011

Расширение ключевого слова 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;

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

26 голосов
/ 31 июля 2013

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

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

3 голосов
/ 08 ноября 2011

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

Один из способов заключается в следующем:

   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;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...