当前位置: 首页 > 面试题库 >

使用唯一索引删除重复项

鲁杜吟
2023-03-14
问题内容

我相信在A,B,C,D的两个表字段之间插入了唯一索引,以防止重复。但是我以某种方式简单地对它们做了一个普通索引。因此插入了重复项。它是2000万个记录表。

如果我将现有索引从普通索引更改为唯一索引,或者只是为A,B,C,D添加新的唯一索引,由于存在唯一记录,重复项将被删除还是添加失败?我将对其进行测试,但它已达到3000万条记录,并且我既不希望将表弄乱或复制它。


问题答案:

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

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扩展。它控制ALTER TABLE新表中唯一键上是否有重复项或启用严格模式时是否出现警告的工作方式。如果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模式的比较



 类似资料:
  • 问题内容: 我正在使用SQL Server 2008,并且拥有一个数据库,其中包含150个以上具有重复索引的表。 我发现一些SQL脚本将列出重复的索引,但是我不确定是否应该信任它们。据说他们说我有400多个重复索引;我不确定这是否正确,因此不希望使用它们来自动删除重复项。 如何确定找到重复索引并将其删除? 问题答案: 查看Tom LaRock出色的“如何查找重复索引”博客文章-他详细解释了如何进行

  • 问题内容: 我有一个包含多个重复条目的索引。它们具有不同的ID,但其他字段具有相同的内容。 例如: 删除重复项后: 有没有一种方法可以删除所有重复项并仅保留一个不同的条目,而无需手动比较所有条目? 问题答案: 我使用rails,如有必要,我将使用命令导入内容,该命令将删除并重新索引该索引和类型的所有内容……但是不确定您在哪个环境中运行ES。我只能看到的问题是数据源是否您正在从中导入(即数据库)的记

  • 我有一个数据帧(df) 我试图删除任何具有相同snap_time索引的行 我试过: 但它没有删除重复的行。 本例的预期输出为:

  • 我有一个数据框 我只想保留唯一的索引,因为索引1是重复的,我想删除它的第二个实例,我该怎么做?我想要我的结果