SQLiteでデータを扱う際、特定のカラムの値が重複しているレコードを削除したいケースがよくあります。
今回は、usersテーブルを例にして、emailカラムの値が重複しているレコードを削除する方法をメモします。
SQLiteで重複データを検索する
まず、どのレコード重複しているのかを特定する必要があります。
以下のSQLクエリを実行すると、emailカラムが複数回出現する値を持つレコードを取得できます。
SELECT *
FROM users
WHERE email IN (
SELECT email
FROM users
GROUP BY email
HAVING COUNT(*) > 1
);
このクエリのポイントは以下の通りです。
- サブクエリで
emailカラムごとにグループ化し、同じemailを持つレコードが2件以上ある場合に絞り込む。 - メインクエリで、このサブクエリで抽出された
emailカラムの値に該当するレコードを取得する。
SQLiteで重複データを削除する
上記の方法で重複データを抽出できたので、次に削除を行います。以下のクエリを実行すると、emailカラムの値が重複しているレコードを削除できます。
DELETE FROM users
WHERE email IN (
SELECT email
FROM users
GROUP BY email
HAVING COUNT(*) > 1
);
SQLiteでの削除時の注意点
SQLiteでは、DELETE文にサブクエリを使用するとエラーが発生する場合があります。そのため、安全に削除するために、一時テーブルを使用する方法を推奨します。
-- ① 重複する email の値を一時テーブルに保存
CREATE TEMPORARY TABLE duplicate_emails AS
SELECT email
FROM users
GROUP BY email
HAVING COUNT(*) > 1;
-- ② 重複するレコードを削除
DELETE FROM users
WHERE email IN (SELECT email FROM duplicate_emails);
-- ③ 一時テーブルを削除
DROP TABLE duplicate_emails;
この方法では、一時テーブルに重複するemailの一覧を保存してから削除するため、安全かつスムーズに処理できます。
まとめ
SQLiteで特定のカラムの値が重複しているレコードを削除する方法についてでした。
実践手順:
- 重複データを検索 (
SELECT ... GROUP BY ... HAVING COUNT(*) > 1) DELETE文を用いて削除(SQLiteの仕様によっては一時テーブルを活用)
データの管理を適切に行うことで、SQLiteのパフォーマンスを向上させ、データの整合性を保つことができます。


コメント