SQLiteで重複データを削除する方法

※当サイトではアフィリエイト広告を利用しています

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で特定のカラムの値が重複しているレコードを削除する方法についてでした。

実践手順:

  1. 重複データを検索 (SELECT ... GROUP BY ... HAVING COUNT(*) > 1)
  2. DELETE文を用いて削除(SQLiteの仕様によっては一時テーブルを活用)

データの管理を適切に行うことで、SQLiteのパフォーマンスを向上させ、データの整合性を保つことができます。

コメント