MySQL:ALTER IGNORE TABLE给出“完整性约束违规”

我试图从ALTER IGNORE TABLE +一个唯一的键删除MySQL表中的重复项。 MySQL文档说:

IGNORE是标准SQL的MySQL扩展。 它控制着如果新表中的唯一键上有重复,或者如果启用严格模式时发生警告,ALTER TABLE如何工作。 如果未指定IGNORE,则复制被中止并在发生重复键错误时回退。 如果指定了IGNORE,则只有第一行用于具有唯一键上重复的行。 其他冲突的行被删除。 不正确的值被截断为最接近匹配的可接受值。

当我运行查询…

ALTER IGNORE TABLE table ADD UNIQUE INDEX dupidx (field) 

…我仍然得到错误#1062 – 关键'dupidx'的重复条目'blabla'

MySQL的IGNORE关键字扩展似乎在某些MySQL版本的InnoDB版本中存在一个bug 。

您可以随时将其转换为MyISAM,IGNORE-ADD索引,然后转换回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; 

这允许您只将唯一的数据插入到表中