MySQL重複データの処理
8950 ワード
一部のMySQLデータテーブルには重複レコードが存在する可能性があります.重複データの存在を許可する場合もありますが、重複データを削除する必要がある場合もあります.
このブログでは、データ・テーブルの重複データを防止する方法と、データ・テーブルの重複データを削除する方法について説明します.
テーブルに重複データが表示されないようにする
MySQLデータテーブルで指定したフィールドをPRIMARY KEY(プライマリキー)またはUNIQUE(ユニーク)インデックスに設定して、データの一意性を保証できます.
次の表にインデックスとプライマリ・キーがないため、複数の重複レコードを許可する例を試してみましょう.
テーブルのフィールドfirst_を設定したい場合はname,last_nameデータは重複できません.デュアルプライマリ・キー・モードを設定してデータの一意性を設定できます.デュアル・プライマリ・キーを設定すると、そのキーのデフォルト値はNULLではなく、NOT NULLに設定できます.次のようになります.
ユニークなインデックスを設定すると、重複するデータを挿入するときにSQL文が正常に実行されず、エラーが発生します.
INSERT IGNORE INTOとINSERT INTOの違いは、INSERT IGNOREはデータベースにすでに存在するデータを無視し、データベースにデータがなければ新しいデータを挿入し、データがあればスキップすることです.これにより、データベースにすでに存在するデータを保持し、ギャップにデータを挿入する目的を達成できます.
次の例では、INSERT IGNORE INTOを使用しています.実行後にエラーが発生したり、データテーブルに重複データが挿入されたりしません.
INSERT IGNORE INTOデータを挿入した場合、記録の一意性が設定された後、重複データを挿入した場合、エラーは返されず、警告形式でのみ返されます.一方、REPLACE INTO intoはprimaryまたはuniqueと同じレコードがある場合は削除します.新しいレコードを挿入します.
別のデータを設定する唯一の方法は、次のようにUNIQUEインデックスを追加することです.
統計重複データ
統計表のfirst_nameとlast_nameの重複レコード数:
以上のクエリ文はpersonを返します.tblテーブルで繰り返されるレコード数.一般的に、クエリの繰り返し値は次のようになります.は、どのカラムに含まれる値が重複する可能性があるかを決定します. 列選択リストでCOUNT(*)を使用してリストされている列. GROUP BY句にリストされる列. HAVING句設定重複数が1より大きい.
重複データのフィルタ
重複しないデータを読み込む必要がある場合は、SELECT文でDISTINCTキーワードを使用して重複データをフィルタできます.
GROUP BYを使用して、データテーブルの重複しないデータを読み込むこともできます.
重複データの削除
データテーブルの重複データを削除する場合は、次のSQL文を使用します.
もちろん、データテーブルにINDEX(インデックス)とPRIMAY KEY(プライマリ・キー)という簡単な方法を追加して、テーブルの重複レコードを削除することもできます.方法は次のとおりです.
このブログでは、データ・テーブルの重複データを防止する方法と、データ・テーブルの重複データを削除する方法について説明します.
テーブルに重複データが表示されないようにする
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テーブルで繰り返されるレコード数.一般的に、クエリの繰り返し値は次のようになります.
重複データのフィルタ
重複しないデータを読み込む必要がある場合は、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);