我正在尝试使用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'。
答案 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;
这允许您只将唯一数据插入表