MySQL重複データの処理

8950 ワード

一部のMySQLデータテーブルには重複レコードが存在する可能性があります.重複データの存在を許可する場合もありますが、重複データを削除する必要がある場合もあります.
このブログでは、データ・テーブルの重複データを防止する方法と、データ・テーブルの重複データを削除する方法について説明します.
テーブルに重複データが表示されないようにする
MySQLデータテーブルで指定したフィールドをPRIMARY KEY(プライマリキー)またはUNIQUE(ユニーク)インデックスに設定して、データの一意性を保証できます.
 
次の表にインデックスとプライマリ・キーがないため、複数の重複レコードを許可する例を試してみましょう.
CREATE TABLE person_tbl
(
    first_name CHAR(20),
    last_name CHAR(20),
    sex CHAR(10)
);

テーブルのフィールドfirst_を設定したい場合はname,last_nameデータは重複できません.デュアルプライマリ・キー・モードを設定してデータの一意性を設定できます.デュアル・プライマリ・キーを設定すると、そのキーのデフォルト値はNULLではなく、NOT NULLに設定できます.次のようになります.
CREATE TABLE person_tbl
(
   first_name CHAR(20) NOT NULL,
   last_name CHAR(20) NOT NULL,
   sex CHAR(10),
   PRIMARY KEY (last_name, first_name)
);

ユニークなインデックスを設定すると、重複するデータを挿入するときにSQL文が正常に実行されず、エラーが発生します.
INSERT IGNORE INTOとINSERT INTOの違いは、INSERT IGNOREはデータベースにすでに存在するデータを無視し、データベースにデータがなければ新しいデータを挿入し、データがあればスキップすることです.これにより、データベースにすでに存在するデータを保持し、ギャップにデータを挿入する目的を達成できます.
次の例では、INSERT IGNORE INTOを使用しています.実行後にエラーが発生したり、データテーブルに重複データが挿入されたりしません.
mysql> INSERT IGNORE INTO person_tbl (last_name, first_name)
    -> VALUES( 'Jay', 'Thomas');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT IGNORE INTO person_tbl (last_name, first_name)
    -> VALUES( 'Jay', 'Thomas');
Query OK, 0 rows affected (0.00 sec)

INSERT IGNORE INTOデータを挿入した場合、記録の一意性が設定された後、重複データを挿入した場合、エラーは返されず、警告形式でのみ返されます.一方、REPLACE INTO intoはprimaryまたはuniqueと同じレコードがある場合は削除します.新しいレコードを挿入します.
別のデータを設定する唯一の方法は、次のようにUNIQUEインデックスを追加することです.
CREATE TABLE person_tbl
(
   first_name CHAR(20) NOT NULL,
   last_name CHAR(20) NOT NULL,
   sex CHAR(10)
   UNIQUE (last_name, first_name)
);

統計重複データ
統計表のfirst_nameとlast_nameの重複レコード数:
mysql> SELECT COUNT(*) as repetitions, last_name, first_name
    -> FROM person_tbl
    -> GROUP BY last_name, first_name
    -> HAVING repetitions > 1;

以上のクエリ文はpersonを返します.tblテーブルで繰り返されるレコード数.一般的に、クエリの繰り返し値は次のようになります.
  • は、どのカラムに含まれる値が重複する可能性があるかを決定します.
  • 列選択リストでCOUNT(*)を使用してリストされている列.
  • GROUP BY句にリストされる列.
  • HAVING句設定重複数が1より大きい.

  • 重複データのフィルタ
    重複しないデータを読み込む必要がある場合は、SELECT文でDISTINCTキーワードを使用して重複データをフィルタできます.
    mysql> SELECT DISTINCT last_name, first_name
        -> FROM person_tbl
        -> ORDER BY last_name;

    GROUP BYを使用して、データテーブルの重複しないデータを読み込むこともできます.
    mysql> SELECT last_name, first_name
        -> FROM person_tbl
        -> GROUP BY (last_name, first_name);

    重複データの削除
    データテーブルの重複データを削除する場合は、次のSQL文を使用します.
    mysql> CREATE TABLE tmp SELECT last_name, first_name, sex
        ->                  FROM person_tbl;
        ->                  GROUP BY (last_name, first_name);
    mysql> DROP TABLE person_tbl;
    mysql> ALTER TABLE tmp RENAME TO person_tbl;

    もちろん、データテーブルにINDEX(インデックス)とPRIMAY KEY(プライマリ・キー)という簡単な方法を追加して、テーブルの重複レコードを削除することもできます.方法は次のとおりです.
    mysql> ALTER IGNORE TABLE person_tbl
        -> ADD PRIMARY KEY (last_name, first_name);