リレーショナルデータベース(10):MySQLでの重複データの処理

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);

おすすめ

転載: blog.csdn.net/weixin_43145427/article/details/124189810