表示するクエリは両方の重複を削除することに注意してください。どちらか一方を維持したいと思います。
このクエリの書き方は次のとおりです。
DELETE t1 FROM table1 AS t1 JOIN table1 AS t2
ON t1.id > t2.id AND t1.field_name = t2.field_name;
not-equals-to の代わりに greater-than を使用すると、両方ではなく、1 つの行 (後の行) のみを削除します。
(id, field_name) に対する複合インデックスが役立つ場合があります。EXPLAIN
最適化レポートを取得するには、MySQL でこれを確認する必要があります。ただし、クエリEXPLAIN
のみをサポートしているSELECT
ため、同等のものを実行しSELECT
て最適化を確認する必要があります。
EXPLAIN SELECT * FROM table1 AS t1 JOIN table1 AS t2
ON t1.id > t2.id AND t1.field_name = t2.field_name;
また、テストについても尋ねました。重複を含む行のサンプルをtest
データベースのテーブルにコピーすることをお勧めします。
CREATE TABLE test.table1test SELECT * FROM realdb.table1 LIMIT 10000;
DELETE
これで、解が正しいと確信できるまで、サンプル データに対して実験を実行できます。
USE test;
SET autocommit = 0;
DELETE ...
ROLLBACK;
データベース内のスクラッチ テーブルにはtest
、実際のデータベース内の実際のテーブルとは別の名前を付けることをお勧めします。DELETE
誤って実際のデータベースをデフォルトのデータベースとして使用している間に実験を実行した場合に備えて!
あなたのコメントについて:
USE test
mysql クライアントの組み込みコマンドです。test
データベースをデフォルトのデータベースとして設定します。データベース名で修飾せずにクエリでテーブルに名前を付けると、これがデフォルトのデータベースになります。http://dev.mysql.com/doc/refman/5.1/en/use.htmlを参照してください。
SET autocommit = 0
各クエリのトランザクションを暗黙的にコミットするデフォルトの動作をオフにします。したがって、トランザクションを終了するには、 COMMIT
orコマンドを明示的に指定する必要があります。http://dev.mysql.com/doc/refman/5.1/en/commit.htmlROLLBACK
を参照してください。
ROLLBACK
そのトランザクションで行われた変更が破棄されるため、実験するときに使用する価値があります。これは、別の実験を試すことができるように、テスト データの初期状態にすばやく戻る方法です。
DELETE t1
はタイプミスではありません。 DELETE
テーブル全体ではなく行を削除します。 ステートメントの条件を満たす各行t1
の別名です(ただし、テーブル内のすべての行が条件に含まれる可能性があります)。http://dev.mysql.com/doc/refman/5.1/en/delete.htmlで複数テーブルの削除の説明を参照してください。
PHP でループを実行し、変数を使用してループを反復処理するときのようなものです: for ($i=0; $i<100; ++$i)
... 変数$i
は一連の値を取り、ループを通過するたびに異なる値を持ちます。
これは、私のソリューションが複数の重複を削除する方法を示すデモです。これをtest
データベースで実行し、コマンド ウィンドウから直接結果を貼り付けています。
mysql> create table table1 (id serial primary key, field_name varchar(10));
Query OK, 0 rows affected (0.45 sec)
mysql> insert into table1 (field_name)
values (42), (42), (42), (42), (42), (42);
Query OK, 6 rows affected (0.00 sec)
Records: 6 Duplicates: 0 Warnings: 0
mysql> select * from table1;
+----+------------+
| id | field_name |
+----+------------+
| 1 | 42 |
| 2 | 42 |
| 3 | 42 |
| 4 | 42 |
| 5 | 42 |
| 6 | 42 |
+----+------------+
6 rows in set (0.00 sec)
mysql> delete t1 from table1 t1 join table1 t2
on t1.id > t2.id and t1.field_name = t2.field_name;
Query OK, 5 rows affected (0.00 sec)
mysql> select * from table1;
+----+------------+
| id | field_name |
+----+------------+
| 1 | 42 |
+----+------------+
1 row in set (0.00 sec)