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

时间:2011-11-08 16:07:42

标签: mysql unique-constraint

我正在尝试使用ALTER IGNORE TABLE + UNIQUE KEY从MySQL表中删除重复项。 MySQL文档说:

  

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

当我运行查询时......

ALTER IGNORE TABLE table ADD UNIQUE INDEX dupidx (field)

...我仍然收到错误#1062 - 关键'dupidx'重复输入'blabla'

3 个答案:

答案 0 :(得分:96)

MySQL的IGNORE关键字扩展似乎在某个版本的MySQL上有bug in the InnoDB version

您可以随时转换为MyISAM,IGNORE-ADD索引,然后转换回InnoDB

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

注意,如果您有外键约束,这将无效,您必须先删除它们,然后稍后再添加。

答案 1 :(得分:26)

或尝试设置会话old_alter_table = 1(不要忘记将其设置回来!)

请参阅:http://mysqlolyk.wordpress.com/2012/02/18/alter-ignore-table-add-index-always-give-errors/

答案 2 :(得分: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;

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