【问题标题】:MySQL: ALTER IGNORE TABLE gives "Integrity constraint violation"MySQL:ALTER IGNORE TABLE 给出“违反完整性约束”
【发布时间】:2011-12-24 14:29:48
【问题描述】:

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

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

当我运行查询时...

ALTER IGNORE TABLE table ADD UNIQUE INDEX dupidx (field)

...我仍然收到错误 #1062 - Duplicate entry 'blabla' for key 'dupidx'

【问题讨论】:

    标签: mysql unique-constraint


    【解决方案1】:

    或尝试设置会话 old_alter_table=1(别忘了将其设置回来!)

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

    【讨论】:

    • 这对我有用。它在大桌子上很长,但看起来相当线性。在我的机器上,它每小时可以处理大约 2GiB 的数据,大约需要两天时间。我想知道这与接受的解决方案相比如何,即转换为 myISAM,添加索引并转换回来。
    • 当心!如果您使用复制,old_alter_table 设置不会复制,因此ALTER TABLE IGNORE 将在从属服务器上失败并中断复制。为了解决这个问题,我在从属服务器上手动执行了ALTER,然后使用SET GLOBAL sql_slave_skip_counter = 1 跳过了有问题的ALTER TABLE,然后恢复了复制。
    【解决方案2】:

    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;
    

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

    【讨论】:

    • 在指向 InnoDB 错误的链接中有一个建议的解决方法,首先运行 set session old_alter_table=1; 这对我有用。
    • 谢谢彼得 - 现在这似乎对我有用。不知道这个问题 - 我的开发机器是 mariadb 但是当我不得不在生产环境(mysql 5.5)上运行时遇到了这个问题。这个 stackoverflow 拯救了我的一天!
    • 这很可能是我在 Stack Overflow 上见过的最差的答案。即使是中型表,更改存储引擎本身也是一项重大任务。这三个查询可能会将数据库服务器锁定数小时。这根本不是一个解决方案。
    • 我觉得我当时有点病了
    【解决方案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;
    

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

    【讨论】:

    • 不,IGNORE 关键字应该处理这些重复项。这就是这个解决方案的美妙之处。请参阅我的问题中引用的文档。
    猜你喜欢
    • 2020-01-14
    • 2021-12-13
    • 2017-10-01
    • 2019-04-12
    • 1970-01-01
    • 2020-04-08
    • 2016-04-13
    相关资源
    最近更新 更多