MySQL テーブルから重複データをすべて削除するにはどうすればよいですか?
たとえば、次のデータの場合:
SELECT * FROM names;
+----+--------+
| id | name |
+----+--------+
| 1 | google |
| 2 | yahoo |
| 3 | msn |
| 4 | google |
| 5 | google |
| 6 | yahoo |
+----+--------+
SELECT DISTINCT name FROM names;
クエリの場合は使用しますSELECT
。
DELETE
重複を削除し、それぞれ 1 つのレコードのみを保持するには、どうすればよいでしょうか?
ベストアンサー1
編集者の警告: このソリューションは計算効率が悪く、大きなテーブルでは接続がダウンする可能性があります。
注意 -最初にテーブルのテスト コピーでこれを実行する必要があります。
実行してみると、 も含めないとAND n1.id <> n2.id
テーブル内のすべての行が削除されることがわかりました。
最も低い値の行を保持する場合
id
:DELETE n1 FROM names n1, names n2 WHERE n1.id > n2.id AND n1.name = n2.name
最も高い値の行を保持する場合
id
:DELETE n1 FROM names n1, names n2 WHERE n1.id < n2.id AND n1.name = n2.name
私はMySQL 5.1でこの方法を使用しました
他のバージョンについては不明です。
更新: 重複の削除について Google で検索している人はここにたどり着くので、
OP の質問は に関するものですが、 と を使用するとはるかに高速になるDELETE
ことにご注意ください。800 万行のデータベースの場合、以下のクエリには 13 分かかりましたが、 を使用すると2 時間以上かかり、それでも完了しませんでした。INSERT
DISTINCT
DELETE
INSERT INTO tempTableName(cellId,attributeId,entityRowId,value)
SELECT DISTINCT cellId,attributeId,entityRowId,value
FROM tableName;