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

Phi*_*ber 47 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)
Run Code Online (Sandbox Code Playgroud)

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

Emm*_*mma 96

IGNOREMySQL 的关键字扩展似乎在某些版本的MySQL上的InnoDB版本中存在错误.

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

ALTER TABLE table ENGINE MyISAM;
ALTER IGNORE TABLE table ADD UNIQUE INDEX dupidx (field);
ALTER TABLE table ENGINE InnoDB;
Run Code Online (Sandbox Code Playgroud)

请注意,如果您有外键约束,这将不起作用,您必须先删除它们,然后稍后再添加它们.

  • 在InnoDB错误的链接中有一个建议的解决方法,首先运行`set session old_alter_table = 1;`这对我有用. (56认同)
  • 这很可能是我在Stack Overflow上看到过的最糟糕的答案.即使是中型桌子,改变存储引擎也是一项重大任务.这三个查询可能会将数据库服务器锁定数小时.这不过是一个解决方案. (5认同)

Jay*_*yne 26

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

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

  • 这确实对我有用.它在大桌子上很长,但看起来相当线性.在我的机器上,它能够每小时处理大约2GiB的数据,大约两天.我想知道这与接受的解决方案相比如何,即转换为myISAM,添加索引并转换回来. (2认同)