MySQLデータテーブルに重複レコードがある場合があります。重複データの存在が許可される場合もありますが、これらの重複データを削除する必要がある場合もあります。次に、データテーブル内の重複データを防止する方法と、データテーブル内の重複データを削除する方法を紹介します。
データの一意性
MySQLデータテーブルの指定されたフィールドを PRIMARYKEY(主キー) または UNIQUE(一意) インデックスとして設定して、データの一意性を確保できます。
例:
# 下表中无索引及主键,所以该表允许出现多条重复记录。
CREATE TABLE person_tbl
(
first_name CHAR(20),
last_name CHAR(20),
sex CHAR(10)
);
二重主キーが設定されている場合、そのキーのデフォルト値をNULLにすることはできず、NOTNULLに設定できます。
# 如果想设置表中字段 first_name,last_name 数据不能重复
# 一种是通过PRIMARY KEY设置主键模式来设置数据的唯一性,如下所示:
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)
);
# 另一种设置数据的唯一性方法是添加一个 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)
);
一意のインデックスを設定した場合、INSERT INTOが重複データを挿入すると、SQLステートメントは正常に実行されず、エラーがスローされます。INSERT IGNORE INTOは、データベース内の既存のデータを無視します。データベースにデータがない場合は、新しいデータを挿入します。データがある場合は、このデータをスキップします。INSERT IGNORE INTOデータを挿入するときに、レコードの一意性を設定した後、重複データを挿入してもエラーは返されませんが、警告のみが返されます。REPLACE 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)
mysql> REPLACE INTO person_tbl (last_name, first_name)
-> VALUES( 'Jay', 'Thomas');
Query OK, 1 rows affected (0.00 sec)
統計重複データ
例:
# 统计表中 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;
一般に、重複する値を照会するには、次のようにします。
- 重複する可能性のある値が含まれている列を特定します。
- これらの列を一覧表示するには、列選択リストでCOUNT(*)を使用します。
- GROUPBY句にリストされている列。
- 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);