删除MySQL中的重复项

时间:2017-01-15 04:24:02

标签: mysql

我有一个数据库表,它是通过导入几千个非常大的文本文档生成的。出于某种原因,一些文件被多次导入。

我正在尝试使用以下查询删除重复的行:

ALTER IGNORE TABLE mytable ADD UNIQUE INDEX myindex (LASTNAME, FIRSTNAME, HOUSENUMBER, STREET, CITY, ZIP, DOB, SEX);

但是我收到了错误

  

1062 - 重复录入

显然,IGNORE已被弃用。

如何从数据库中删除重复项?

我想我必须使用DELETE进行JOIN,但我无法弄清楚代码。

该表格为InnoDB,目前有大约40,000,000行(应该有大约17,000,000行)。每行都有一个主键。

考虑到尺寸,我犹豫是暂时将桌子换成MyISAM。

3 个答案:

答案 0 :(得分:0)

  

每一行都有一个主键

是一个唯一的号码吗?

像这样创建一个AUX表(假设ID是PK):

create table mytable_aux as (
select LASTNAME, FIRSTNAME, HOUSENUMBER, STREET, CITY, ZIP, DOB, SEX, MIN(ID)
from mytable 
group by LASTNAME, FIRSTNAME, HOUSENUMBER, STREET, CITY, ZIP, DOB, SEX);

然后删除不在aux表中的所有内容:

delete from mytable  where id not in (select aux.id from mytable_aux aux) ;

答案 1 :(得分:0)

假设它只是一个表,并且您可以使用SQL转储......

  • CREATE表已建立所有关系但未插入数据。将INSERT语句保存在单独的.sql文件中。

  • 将所有INSERT语句更改为INSERT IGNORE

  • 导入仅包含.sql语句的更新INSERT IGNORE文件。重复项将自动被忽略。

请注意,如果不手动比较,您将无法确定忽略了哪些或多少条记录。

但是,如果你完全确定你真的不需要基于表中定义的关系的重复项,那么这种方法可以很好地工作。


此外,如果您想对多个表执行相同的操作,则必须确保在开始时CREATE所有表,定义外键/依赖项AND ,最重要的是,安排新的.sql文件,使得无依赖的表获得INSERT语句加载第一。同样,最后一组INSERT语句将用于具有最多依赖项的表。

希望有所帮助。

答案 2 :(得分:0)

如果这些是您表格中的唯一字段,您可以随时:

create table temp_unique as
select distinct LASTNAME, FIRSTNAME, HOUSENUMBER, STREET, CITY, ZIP, DOB, SEX
from mytable

然后重命名(或者如果你敢于掉落)mytable并将temp_unique重命名为mytable,然后创建索引(确保创建任何其他索引或FK或已存在的任何内容)。

如果您正在使用直播表,则必须一次删除一个基础记录。这有点不同 - 添加一个uid然后执行删除。如果那是你的情况,请告诉我们,我们可以重构。