2011-10-27 9 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

のように処理したい場合は、ここに簡単な方法があります。
すべてを1つの取引で確認してください。
'John Smith'のエントリが既にtbl_delに存在する場合は、削除されたIDを代わりに追加するには、UPDATEを確認する必要があります。

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にはベイトポイントがあると思います。

4

は別の列でそれをしないでください - カンマ区切りのリストとして保存するIDが右に感じることはありません、それはありませんか?

PrimaryUserIdとDeletedUserIdの2つの列を持つテーブルを作成することをお勧めします。PrimaryUserIdは「9627」などとなります。実際に保持するレコードの1つで、削除したすべての複製に対して行が追加されます。メインテーブル。この方法では、重複エントリが削除されたときを知っている列を格納することもできます。

+0

私はそれについて考えました。それに対して賢明な解決策が出たら、私はそれを検討します。唯一の問題は、200mmの行を処理していることです。また、deleted_idsにはほとんどアクセスできません。カンマ区切りのアプローチは保存上の理想になります。 –

+0

@Paul:これが最適です。このアプローチのために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 
); 

することができますから、すべての行を削除します新しいテーブルに自動インクリメントキーがあります。 私はこれらのクエリを実行していませんが、ここにいくつかのエラーがある場合は私を許してください。 これらの2つのテーブル内に1対多の関係を持つことは、将来的には大変便利なことです。データを簡単に照会することができます。

+0

通知しませんでした答えは受け入れられました – Zohaib

関連する問題