2014-02-20 94 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