2012-12-10 86 views
5

我收到了一個相當大的MySQL數據庫,其中有很多重複項。大約三分之一的數據庫是重複的。這也是失蹤一個主鍵。在沒有主鍵的情況下刪除MySQL數據庫中的重複項

數據庫的結構是這樣:

unique_id | field01 | field02 | field03 | field04 | ...... | field26 | field27 | 

現在雖然UNIQUE_ID應該是,好,獨特的;有很多重複。

此外,對於屬於特定unique_id副本的一組行,其餘列可能相同或不同。例如,查看下面的unique_id'id_1',field01在兩個實例中都是相同的,但field02 & field03不是。

我想刪除重複,並且每個unique_id只有一個副本生存。 哪一個倖存下來並不重要。

例子:

id_1 | abc | dfd | NULL | ... | def | 
id_2 | abc | daf | ghi | ... | 12a | 
id_1 | abc | xyz | jkl | ... | def | 
id_4 | aaa | bbb | NULL | ... | def | 
id_3 | NULL | bbb | NULL | ... | 123 | 
id_5 | 1e3 | NULL | NULL | ... | def | 
id_3 | aaa | bbb | fds | ... | def | 
id_9 | awa | bbb | NULL | ... | 910 | 

應該改爲:

id_1 | abc | dfd | NULL | ... | def | 
id_2 | abc | daf | ghi | ... | 12a | 
id_4 | aaa | bbb | NULL | ... | def | 
id_3 | NULL | bbb | NULL | ... | 123 | 
id_5 | 1e3 | NULL | NULL | ... | def | 
id_9 | awa | bbb | NULL | ... | 910 | 

或者,這也未嘗不可:

id_2 | abc | daf | ghi | ... | 12a | 
id_1 | abc | xyz | jkl | ... | def | 
id_4 | aaa | bbb | NULL | ... | def | 
id_5 | 1e3 | NULL | NULL | ... | def | 
id_3 | aaa | bbb | fds | ... | def | 
id_9 | awa | bbb | NULL | ... | 910 | 

一旦做到這一點,我需要設置unique_is爲首要的關鍵。

請指教最好的和準確的方式來做到這一點。提前致謝。

+0

待辦事項你想僅在unique_id列上進行重複檢查嗎? –

+0

請參閱此主題,您將獲得有關刪除重複值的一些見解:: http://stackoverflow.com/questions/2728413/equivalent-of-oracles-rowid-in-mysql –

回答

2

你可以在你的表中添加一個唯一索引,忽略所有的錯誤,並讓MySQL的刪除所有重複的行(除了一個),爲您提供:

ALTER IGNORE TABLE your_table ADD UNIQUE INDEX dupidx (unique_id) 

,但如果你仍然得到一個錯誤,即使你使用ignore子句,試試這個:

ALTER TABLE your_table ENGINE MyISAM; 
ALTER TABLE IGNORE your_table ADD UNIQUE INDEX dupidx (unique_id); 
ALTER TABLE your_table ENGINE InnoDB; 

如果你在顯示你的數據,只用1個排的每個重複的ID有興趣,你可以這樣做:

SELECT * 
FROM your_table 
GROUP BY unique_id 
0

試試這個: select unique_id, field01 , field02 , field03 from (table_name) group by unique_id having sum(unique_id)<1

1

我有這樣的問題,這對我來說真是棒極了:

CREATE TABLE newtable SELECT * FROM oldtable GROUP BY unique_id; 

然後放下oldtable,新表重命名爲舊錶名

相關問題