次の例では、主キーまたは一意の識別子の列を無視して、MySQLの重複行を削除します。
この例では、重複する行を削除しますが、1つは保持します。したがって、2つの同一の行の場合、一方を削除し、もう一方を保持します。
サンプルデータ
次のデータを含むテーブルがあるとします。
SELECT * FROM Dogs;
結果:
+---------+-------------+------------+ | DogId | FirstName | LastName | |---------+-------------+------------| | 1 | Bark | Smith | | 2 | Bark | Smith | | 3 | Woof | Jones | | 4 | Ruff | Robinson | | 5 | Wag | Johnson | | 6 | Wag | Johnson | | 7 | Wag | Johnson | +---------+-------------+------------+
最初の2行が重複しており、最後の3行が重複していることがわかります。
重複を見つける
まず、テーブルをチェックして、重複している行の数を確認しましょう。
SELECT
FirstName,
LastName,
COUNT(*) AS Count
FROM Dogs
GROUP BY FirstName, LastName
HAVING COUNT(*) > 1;
結果:
+-----------+----------+-------+ | FirstName | LastName | Count | +-----------+----------+-------+ | Bark | Smith | 2 | | Wag | Johnson | 3 | +-----------+----------+-------+
Bark Smithには2行、WagJohnsonには3行あることがわかります。
テーブルの重複を解除して、それぞれが1つだけ含まれるようにします。
重複を削除
次のコードを実行すると、上記のテーブルの重複が解除されます。
DELETE d1 FROM Dogs d1
INNER JOIN Dogs d2
WHERE
d1.DogId < d2.DogId AND
d1.FirstName = d2.FirstName AND
d1.LastName = d2.LastName;
結果:
Query OK, 3 rows affected (0.00 sec)
結果を見てみましょう:
SELECT * FROM Dogs;
結果:
+-------+-----------+----------+ | DogId | FirstName | LastName | +-------+-----------+----------+ | 2 | Bark | Smith | | 3 | Woof | Jones | | 4 | Ruff | Robinson | | 7 | Wag | Johnson | +-------+-----------+----------+
テーブルから重複する行を正常に削除しました。