我有一个数据库表,它是通过导入几千个非常大的文本文档生成的。出于某种原因,一些文件被多次导入。
我正在尝试使用以下查询删除重复的行:
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。
答案 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然后执行删除。如果那是你的情况,请告诉我们,我们可以重构。