2014-02-20 67 views
0

我有一个表“表A”重复记录像 “`如何删除mysql中的重复记录? (减查询执行时间大表)

ID Name  Course 
01 abc  dotnet 
02 xyz  java 
03 mno  sas 
04 abc  dotnet 
05 xyz  java 
06 abc  dotnet 
07 aaa  testing 
08 bbb  sap 

--- “abc” came 3 times (id—1,4,6) 
--- “xyz” came 2 times (id – 2,5) 

`” 从上面的表格I(基于“名称”列式两份)需要删除重复项(ID为-1,4,2) - 不是ID 6,5这些是最新的文件。 “table-A”只能包含 -

ID Name  Course 
03 mno  sas 
05 xyz  java 
06 abc  dotnet 
07 aaa  testing 
08 bbb  sap 

I tried like— 

CREATE TEMPORARY TABLE temptable (idTemp int(12), totTemp int(4)); 

INSERT INTO temp_table(`idTemp`, `totTemp`) select max(ID), count(*) as tot from table-A 
     group by Name, Course having tot > 1 or tot =1 order by ID ; 

Delete from table-A where ID not in (select idTemp from temp_table); 

上述代码正在工作。但是在大数据表上需要花费很长时间。我的表格包含200,000条40列以上的记录,每个月它会添加20,000条记录。

在这种情况下,我需要找到基于10列(group by 10列)的重复项,任何人都可以提出正确,快速的工作代码。

我在互联网上发现不同的逻辑,并尝试过,但他们比我上面解释的花费更多的时间。

我主要关心的是查询执行时间。所以请建议我好的逻辑或查询哪些将做上面的任务快。

(仅供参考: - 我在stackoverflow中也发现了一些逻辑,最好的建议是在每个列上创建唯一索引,但在我的情况下,数据来自政府每个月,它可能包含重复项在文件中,以及比较数据库。所以我需要删除重复或显示重复电网(使用asp.net)。 )

+0

您最关心的是时间,所以我们最好快点为您做这份工作? http://stackoverflow.com/questions/3311903/remove-duplicate-rows-in-mysql,http://stackoverflow.com/questions/4685173/delete-all-duplicate-rows-except-for-one-in- MySQL的。换句话说,这是至少几个问题的重复。 – Mike

回答

0
ALTER IGNORE TABLE table_a ADD UNIQUE INDEX index_123 (name, course); 

这将下降重复行。 ,并使带有重复数据的插入操作产生错误,但请确保在运行此查询之前进行备份

0

您必须手动删除重复项,以防止将来必须使这些值不应重复唯一的,即用户不能共享相同的号码,员工号码等,但他们可以共享相同的姓名。阅读与SQL的独特属性

0
DELETE t1.* 
FROM 
    tableName t1 INNER JOIN tableName t2 
    ON t1.Name=t2.Name 
    AND t1.ID < t2.ID 

请参阅小提琴here

0

我想你应该建立在这些领域的唯一索引,以避免在INSERT

这里重复的查询,删除重复:

DELETE FROM T WHERE ID NOT IN 
(SELECT MAX(ID) FROM (SELECT * FROM T) T1 GROUP BY Name) 

SQLFidddle demo

另一种方式:

DELETE T1 
FROM T as T1 
LEFT JOIN (SELECT MAX(ID) as ID FROM T GROUP BY Name) as T2 
    ON T1.Id=T2.Id 
Where T2.id is null 

SQLFidddle demo