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