English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

MySQL 重複データの処理

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 INTO はデータベースに既存のデータがある場合を無視し、データベースにデータがない場合に新しいデータを挿入し、データがある場合にはそのデータをスキップします。これにより、データベースに既存のデータを保持しつつデータを挿入する目的を達成できます。

以下の例では 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 は、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;

データベーステーブルから重複しないデータを読み取るために 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, sex);
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);