使用唯一索引删除重复项

使用唯一索引删除重复项,第1张

使用唯一索引删除重复

如果表中有重复项,则使用

ALTER TABLE mytable ADD UNIQUE INDEX myindex (A, B, C, D);

该查询将失败,并显示错误1062(重复键)。

但是如果你用

IGNORE

-- (only works before MySQL 5.7.4)ALTER IGNORE TABLE mytable ADD UNIQUE INDEX myindex (A, B, C, D);

重复项将被删除。但是文档没有指定要保留的行:

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

从MySQL 5.7.4开始,ALTER TABLE的IGNORE子句被删除,使用它会产生错误。

(ALTER TABLE语法)

如果您的版本是5.7.4或更高版本-您可以:

  • 将数据复制到临时表中(从技术上讲,它不需要是临时表)。
  • 截断原始表。
  • 创建唯一索引。
  • 并将数据复制回

    INSERT IGNORE
    (仍然可用)。

    CREATE TABLE tmp_data SELECt * FROM mytable;
    TRUNCATE TABLE mytable;
    ALTER TABLE mytable ADD UNIQUE INDEX myindex (A, B, C, D);
    INSERT IGNORE INTO mytable SELECt * from tmp_data;
    DROP TABLE tmp_data;

如果使用

IGNORE
修饰符,则执行
INSERT
语句时发生的错误将
被忽略。例如,如果不
IGNORE
使用,则复制表中现有
UNIQUE
索引或
PRIMARY KEY
值的行将导致重复键错误,并且该语句将中止。使用
IGNORE
,该行将被丢弃,并且不会发生错误。被忽略的错误会生成警告。

(插入语法)

另请参见:INSERT … SELECT语法以及IGNORE关键字和严格SQL模式的比较



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5022366.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-15
下一篇 2022-11-15

发表评论

登录后才能评论

评论列表(0条)

保存