2011-09-07 55 views
0

早上好,stackoverflownians,刪除兩列的重複項

我有一個非常大的表與兩列上的重複。也就是說,如果在排號碼col1和COL2在B行是重複的,我應該只保留一個排:

## table_1 
col1 col2 

1   10 
1   10 
1   10 
1   11 
1   11 
1   12 
2   20 
2   20 
2   21 
2   21 


# should return this tbl without duplication 

col1 col2 

1   10 
1   11 
1   12 
2   20 
2   21 

我以前的代碼的帳戶只爲COL1,我不知道如何在這個查詢2個coluns:

CREATE TABLE temp LIKE db.table_1; 
INSERT INTO temp SELECT * FROM table_1 WHERE 1 GROUP BY col1; 
DROP TABLE table_1; 
ALTER TABLE temp RENAME table_1; 

所以我想過這個問題:

CREATE TABLE temp LIKE db.table_1; 
INSERT INTO temp(col1,col2) 
    SELECT DISTINCT col1,col2 FROM table_1; 

then drop and rename.. 

但我不知道這是要去工作和MySQL往往是不穩定的,如果時間太長,我將不得不停止查詢和我的cr再次灰服務器.. T.T

我們有2億行,他們都至少有一個重複..

代碼的任何建議? :) 另外..需要多長時間?幾分鐘或幾小時?

+0

檢查這個問題的第一個答案;它可以幫助你找出解決方案; http://stackoverflow.com/questions/7105618/how-to-get-only-repeated-records-in-a-table –

+0

INSERT INTO ... SELECT DISTINCT是正確的方法。如果您遇到穩定性問題,請將您的站點/系統脫機,直到查詢完成。提前計劃停機時間。 – cdhowie

回答

0

你已經知道相當多的方式:)

你可以試試這個也

使用INSERT IGNORE而非INSERT。如果一條記錄沒有複製現有的記錄,MySQL會照常插入它。如果記錄是重複的,那麼IGNORE關鍵字告訴MySQL放棄它而不會產生錯誤。

從現有表讀取,然後使用INSERT IGNORE寫入新表中。這樣您可以根據資源使用情況控制插入過程。

當使用INSERT IGNORE並且您確實存在關鍵違例時,MySQL不會發出警告!

+0

謝謝!所以,如果我做INSERT IGNORE INTO temp(col1,col2)SELECT DISTINCT col1,col2 FROM table_1 ==>是否比只插入等速度更快? – madkitty

+1

INSERT IGNORE INTO temp(col1,col2)SELECT DISTINCT col1,col2 FROM table_1 –

+0

我很想知道它是如何執行的。聽起來很有希望。 – Mindfulgeek

0

獨特的條款是要走的路,但它需要一段時間才能在很多記錄上運行。我會添加一個自動添加的ID列,並且是您的PK。然後,您可以分階段運行重複數據刪除,不會超時。

祝你好運,HTH - 喬

+0

OH等待!我真的想這樣做:我試圖在col1上添加ID PK,但它顯示錯誤,因爲它有重複的內容..?我應該添加一個columnd ID AUTO_INCREMENT PRIMARY KEY嗎? – madkitty

+0

OH我誤讀了......如果我有一個ID爲AUTO_INCREMENT的列PK,那該怎麼辦呢? – madkitty

+0

與一個單獨的ID列,你可以批量做....說ID <100,000 ..等 – Mindfulgeek