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;
这允许您只将唯一的数据插入到表中