删除MySQL中的重复项

删除MySQL中的重复项,mysql,Mysql,我有一个数据库表,它是通过导入数千个文本文档生成的,每个文档都非常大。由于某些原因,某些文件被多次导入 我正在尝试使用以下查询删除重复行: ALTER IGNORE TABLE mytable ADD UNIQUE INDEX myindex (LASTNAME, FIRSTNAME, HOUSENUMBER, STREET, CITY, ZIP, DOB, SEX); 但我犯了个错误 1062-重复输入 显然,IGNORE已被弃用 如何从数据库中删除重复项 我想我必须用一个JOIN来做一个D

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

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

ALTER IGNORE TABLE mytable ADD UNIQUE INDEX myindex (LASTNAME, FIRSTNAME, HOUSENUMBER, STREET, CITY, ZIP, DOB, SEX);
但我犯了个错误

1062-重复输入

显然,
IGNORE
已被弃用

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

我想我必须用一个
JOIN
来做一个
DELETE
,但我想不出代码

该表是InnoDB,目前大约有40000000行(应该有17000000行)。每行有一个主键

考虑到尺寸,我犹豫是否暂时将表更改为MyISAM

每行有一个主键

是唯一的号码吗

创建这样一个AUX表(假设ID是主键):

然后删除aux表之外的所有内容:

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

假设它只是一个表,并且您有可用的SQL转储

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

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

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

请注意,如果不进行手动比较,您将无法确定哪些记录或有多少记录被忽略

但是,如果您完全确定不需要基于表中定义的关系的副本,那么这种方法工作得相当好


此外,如果要对多个表执行相同的操作,则必须确保在开始时创建所有表,定义外键/依赖项,最重要的是,安排新的
.sql
文件,使没有依赖关系的表首先加载
INSERT
语句。同样,最后一组
INSERT
语句将用于依赖项最多的表


希望能有所帮助。

如果表中只有这些字段,您可以:

create table temp_unique as
select distinct LASTNAME, FIRSTNAME, HOUSENUMBER, STREET, CITY, ZIP, DOB, SEX
from mytable
然后重命名(或者删除,如果你敢的话)mytable并重命名mytable独有的temp_,然后创建索引(确保创建任何其他索引或FK或任何已经存在的索引)


如果您正在处理活动表,则必须一次删除一条底层记录。这有点不同——添加uid,然后执行删除。如果这是您的情况,请告诉我们,我们可以重构。

这些选项都不适合您吗?看起来我可以将一些选项组合到一个循环查询中。我的主机提供商将查询时间限制在30秒左右,因此单凭某些选项是不起作用的。
create table temp_unique as
select distinct LASTNAME, FIRSTNAME, HOUSENUMBER, STREET, CITY, ZIP, DOB, SEX
from mytable