2011-10-27 112 views
2

我需要從表內找到並刪除重複項,但記錄要刪除的記錄的ID並將其添加到'deleted_ids'字段。SQL刪除重複項 - 保留已刪除的ID

例如,這裏有一個表的一部分,我現在:

+--------+-------------------------------------------------------+ 
| Id  | Name             | 
+--------+-------------------------------------------------------+ 
| 9627 | John Smith           | 
| 9657 | John Smith           | 
| 24455 | John Smith           | 
| 67435 | John Smith           | 
+--------+-------------------------------------------------------+ 

我想達到的效果是:

+--------+-----------------------------+-------------------------+ 
| Id  | Name      | Deleted_Ids    | 
+--------+-----------------------------+-------------------------+ 
| 9627 | John Smith     | 9657,24455,67435  | 
+--------+-----------------------------+-------------------------+ 

我歡迎任何可行的方法,如果任何人都可以提供解決方案或給我建議,我真的很感激它。

感謝, 保羅

+0

你需要什麼樣的刪除項目列表?你有沒有考慮過使用「邏輯刪除」而不是「物理刪除」? –

回答

2

如果你想繼續這樣,這是一個簡單的方法。
一口氣做完一筆交易可以肯定。
如果在tbl_del中可能有'John Smith'的條目,則必須檢查並且UPDATE來代替添加已刪除的ID。

BEGIN; 

INSERT INTO tbl_del 
SELECT name, GROUP_CONCAT(id) AS deleted 
FROM tbl_live 
WHERE name = 'John Smith' 
GROUP BY 1; 

DELETE FROM tbl_live 
WHERE name = 'John Smith'; 

COMMIT; 

但我認爲Veseliq有一個vaid點。

4

不要與另一列做到這一點 - 存儲ID作爲逗號分開,感覺不對,不是嗎?

最好是有第二個表有兩列PrimaryUserId和DeletedUserId - 例如PrimaryUserId將是「9627」 - 您實際保留的記錄之一,並且您將爲您從您的刪除的每個副本添加一行主表。這種方法也可以讓你存儲一個列,知道重複條目何時被刪除。

+0

我想過,如果一個明智的解決方案彈出,我會考慮它。唯一的問題是我正在處理200毫米的行 - 而且deleted_ids很少被訪問。所以逗號分隔的方法將是理想的存儲原因。 –

+0

@保羅:這是最好的。您可以修改Erwin的這個方法的事務。 –

+0

存儲的差異很小。 –

1

的基本方法可首先選擇從舊錶中的所有行,有資格的缺失標準 - > 插入這些行插入到新表 - > 從舊錶

INSERT INTO new_table 
SELECT id,name FROM old_table WHERE id > 
(
    SELECT min(id) FROM old_table B 
    WHERE A.name = B.name 
); 

delete FROM old_table WHERE id > 
(
    SELECT min(id) FROM old_table B 
    WHERE A.name = B.name 
); 

可以刪除所有行在新表中有自動遞增鍵。 我還沒有運行這些查詢,請原諒,如果這裏有一些錯誤,那只是一個想法。 在這兩個表格內具有一對多的關係可以在將來真正得心應手....而且更容易查詢數據

+0

沒有注意到答案已被接受 – Zohaib