1行だけ残したい!MySQLで重複行をサクッと削除する方法
MySQLで重複行をすべて削除し、1行のみ残したい場合は、いくつかの方法があります。
方法1: DISTINCT キーワードを使用する
この方法は、重複する行をグループ化し、各グループから1行のみを選択します。
SELECT DISTINCT *
FROM テーブル名;
方法2: GROUP BY と HAVING 句を使用する
この方法は、重複する行をグループ化し、グループ内の行数をカウントします。そして、カウント数が1である行のみを選択します。
SELECT *
FROM テーブル名
GROUP BY カラム名
HAVING COUNT(*) = 1;
方法3: SUBQUERY を使用する
この方法は、重複する行を子クエリで選択し、それを主クエリで削除します。
DELETE FROM テーブル名
WHERE id IN (
SELECT id
FROM テーブル名
GROUP BY カラム名
HAVING COUNT(*) > 1
);
方法4: ROW_NUMBER() 関数を使用する
この方法は、各行に番号を割り当て、重複する行を削除します。
DELETE FROM テーブル名
WHERE ROW_NUMBER() OVER (PARTITION BY カラム名 ORDER BY id) > 1;
- データ量が少ない場合は、方法1または方法2が簡単です。
- 特定のカラムに基づいて重複を削除したい場合は、方法2または方法4を使用する必要があります。
注意事項
- 上記の例では、
id
カラムを主キーとしています。主キーではない場合は、WHERE
句で適切なカラムを指定する必要があります。 - 重複行を削除する前に、必ずバックアップを取るようにしてください。
SELECT DISTINCT *
FROM customers;
SELECT *
FROM customers
GROUP BY email
HAVING COUNT(*) = 1;
DELETE FROM customers
WHERE id IN (
SELECT id
FROM customers
GROUP BY email
HAVING COUNT(*) > 1
);
DELETE FROM customers
WHERE ROW_NUMBER() OVER (PARTITION BY email ORDER BY id) > 1;
テーブル構造
CREATE TABLE customers (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255),
email VARCHAR(255)
);
INSERT INTO customers (name, email) VALUES
('John Doe', '[email protected]'),
('Jane Doe', '[email protected]'),
('John Smith', '[email protected]'),
('Jane Smith', '[email protected]');
実行結果
| id | name | email |
|---|---|---|
| 1 | John Doe | [email protected] |
説明
上記のサンプルコードでは、customers
テーブルから重複する行をすべて削除し、1行のみ残しています。
- 方法1は、
DISTINCT
キーワードを使用して重複する行をグループ化し、各グループから1行のみを選択します。 - 方法3は、
SUBQUERY
で重複する行を選択し、それを主クエリで削除します。 - 方法4は、
ROW_NUMBER()
関数を使用して各行に番号を割り当て、重複する行を削除します。
UNIQUE
制約は、テーブル内の各行が一意であることを保証します。
ALTER TABLE customers
ADD UNIQUE (email);
方法6: PRIMARY KEY 制約を使用する
PRIMARY KEY
制約は、テーブル内の各行が一意であることを保証し、NULL 値を許可しません。
ALTER TABLE customers
ADD PRIMARY KEY (email);
**方法7: TRUNCATE
TRUNCATE
は、テーブル内のすべてのデータを削除します。
TRUNCATE TABLE customers;
**方法8: DELETE
と LIMIT
DELETE
と LIMIT
を組み合わせて、重複する行を削除できます。
DELETE FROM customers
ORDER BY id
LIMIT 1;
UNIQUE
制約またはPRIMARY KEY
制約を追加すると、既存のデータが重複している場合はエラーが発生します。DELETE
とLIMIT
を使用すると、最新の1行のみが残ります。
mysql sql duplicates