【MySQL】同テーブル内に重複した値を持つレコードを見つけるクエリ

  • 2022年7月21日
  • SQL

 時たま格納される値がユニークであるべきカラムにユニーク制約がついておらず、ユニークでない値が格納されてしまう時があります。そういった問題が起きている時、事態の収拾のために値が重複しているレコードを見つけ、ユニークになる様に何がしかの対応をする必要があります。この値が重複しているレコードを見つけるクエリを紹介します。

 具体的なクエリは次です。

SELECT *
FROM accounts # 重複を持つレコードを探すテーブル(以降大元のテーブル)
WHERE exists(
          # サブクエリで大元のテーブルと大元のテーブルのエイリアスを WHERE でつなぐことによって
          # 同テーブル内の異なるレコードを比較します。
              SELECT *
              FROM accounts sub # 大元のテーブルのエイリアス(以降エイリアステーブル)。
                   # 大元のテーブルとエイリアステーブルの主キーが異なることを示す WHERE です。
                   # これをつけないと同一のレコードを比較対象に選んでしまい、重複を見つけられません。
              WHERE sub.account_id <> accounts.account_id
                # ここでは name が重複しているレコードを見つけます。
                # 適宜、目的のカラムに名前を変更する必要があります。
                AND sub.name = accounts.name
          )

 これを例えば次のテストデータと組み合わせると

create table accounts
(
    account_id bigint unsigned auto_increment
        primary key,
    name       varchar(255) not null comment '名前'
)
    comment 'アカウント' collate = utf8mb4_unicode_ci;
INSERT INTO accounts (name) VALUES ('浜松太郎');
INSERT INTO accounts (name) VALUES ('浜松重複太郎');
INSERT INTO accounts (name) VALUES ('浜松重複太郎');

 次の様になります。

account_id	name
2	浜松重複太郎
3	浜松重複太郎

 これによって冒頭の問題が起きた時も重複を解消すべきレコードを速やかに見つけられます。見つけたら後は削除なり更新なりで重複を解消し、再発防止のためのユニーク制約を付けるだけです。

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG