1. ホーム
  2. mysql

[解決済み] MySQLで1行を除くすべての重複行を削除しますか?[重複している]

2022-03-21 02:05:01

質問

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つのレコードだけを残すようにするには?

解決方法は?

<ブロッククオート

エディタからの警告です。この解決策は計算効率が悪く、大きなテーブルを使用すると接続が切れる可能性があります。

NB - あなた が必要です。 を実行する必要があります。 テストコピー テーブルの

やってみると、これも入れなければ AND n1.id <> n2.id を実行すると、テーブルのすべての行が削除されます。

  1. が最も低い行を残しておきたい場合。 id の値を指定します。

    DELETE n1 FROM names n1, names n2 WHERE n1.id > n2.id AND n1.name = n2.name
    
    
  2. が最も高い行を残しておきたい場合は、その行の id の値を指定します。

    DELETE n1 FROM names n1, names n2 WHERE n1.id < n2.id AND n1.name = n2.name
    
    

MySQL 5.1では、この方法を使用しました。

他のバージョンについては不明です。


更新: 重複排除でググるとここに行き着くので
OPの質問は DELETE を使用することをお勧めします。 INSERTDISTINCT の方がはるかに高速です。800万行のデータベースの場合、以下のクエリは13分かかりました。 DELETE 2時間以上かかっても完了しませんでした。

INSERT INTO tempTableName(cellId,attributeId,entityRowId,value)
    SELECT DISTINCT cellId,attributeId,entityRowId,value
    FROM tableName;