MySQL重複データ処理

34480 ワード

最近仕事が忙しくて、久しぶりにブログを书いて、ヒヒ!今日はMySQLの重複データ処理に関するブログを書きます!先日、重複したデータを除去して、唯一のデータを残すことができるかどうかという開発がありました.そして私は彼にどうしてこんなに繰り返したデータがあるのかと聞いた.彼はプログラムを書いてデータに登って、多くの繰り返しに登ったと言った.消去すると、プライマリ・キーまたはユニーク・キーを追加してロー・データの一意性を保証できませんか?テーブルまたは結果セットに重複レコードが含まれている場合があり、許可されている場合がありますが、重複レコードの使用を停止するように要求される場合があります.重複レコードを識別してテーブルから削除する必要がある場合があります.次に、いくつかの例を挙げて説明します.
 
必要:
1、1枚の表にデータを挿入し、行データが存在する場合は挿入せず、行データが存在しない場合は挿入する
2、一つの表に同じ行の記録があることを削除する
 
一、一つのテーブルにデータを挿入し、テーブルにプライマリ・キーとユニーク・キーがない場合、重複データを挿入することができ、エラーを報告しない:
mysql> show create table  user\G        
*************************** 1. row ***************************
       Table: user
Create Table: CREATE TABLE `user` (
  `first_name` char(20) DEFAULT NULL,
  `code` char(20) DEFAULT NULL,
  `sex` char(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

mysql> 

表にデータを挿入すると、大量の重複データを挿入することができ、エラーを報告することはありません.
mysql> insert into user values ('aa','GZ','M');      
Query OK, 1 row affected (0.05 sec)

mysql> insert into user values ('aa','GZ','M');
Query OK, 1 row affected (0.04 sec)

mysql> select * from user;
+------------+------+------+
| first_name | code | sex  |
+------------+------+------+
| aa         | GZ   | M    |
| aa         | GZ   | M    |
+------------+------+------+
2 rows in set (0.00 sec)

mysql> 

テーブルに作成された複数のレコードが同じ値にならないように、プライマリ・キー(PRIMARY KEY)を定義に追加します.これを行うには、PRIMARY KEYがNULL値を許可しないため、インデックス列がNOT NULLであることを宣言する必要があります.
mysql> show create table user\G
*************************** 1. row ***************************
       Table: user
Create Table: CREATE TABLE `user` (
  `first_name` char(20) NOT NULL DEFAULT '',
  `code` char(20) NOT NULL DEFAULT '',
  `sex` char(10) DEFAULT NULL,
  PRIMARY KEY (`first_name`,`code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

mysql> 

既存のレコードと重複してテーブルを挿入する場合、カラムまたはインデックス列を定義すると、テーブル内の一意のインデックスが存在すると、通常、エラーが発生します.
mysql> insert into user values ('aa','GZ','M');                  
Query OK, 1 row affected (0.04 sec)

mysql> insert into user values ('aa','GZ','M');
ERROR 1062 (23000): Duplicate entry 'aa-GZ' for key 'PRIMARY'
mysql> 

エラーが表示されます.sqlスクリプトを実行すると、エラーがスクリプトを終了する可能性があります.後のSQL文は実行されません.もちろん、-fパラメータを追加することができます.しかし、エラーのヒントはいつも不安を感じさせます.ははは、INSERT IGNOREとREPLACE INTOでデータを挿入することができます.友达はHELP INSERTとHELP REPLACEを通じて使い方を理解することができます.ここではあまり説明しません.
mysql> select * from user;
+------------+------+------+
| first_name | code | sex  |
+------------+------+------+
| aa         | GZ   | M    |
+------------+------+------+
1 row in set (0.00 sec)

mysql> insert ignore user values ('aa','GZ','M');
Query OK, 0 rows affected (0.00 sec)

mysql> 

INSERT IGNOREの構文で挿入すると間違いなく、既存のレコードと重複しない場合、MySQLは正常に挿入します.レコードが重複している場合、IGNOREキーワードは、エラーが発生することなくMySQLに破棄するように伝えます.
REPLACE INTOの効果を見てみましょう.
mysql> replace into user values ('aa','GZ','M');
Query OK, 1 row affected (0.05 sec)

mysql> select * from user;
+------------+------+------+
| first_name | code | sex  |
+------------+------+------+
| aa         | GZ   | M    |
+------------+------+------+
1 row in set (0.00 sec)

エラーが表示されない場合は、REPLACEを使用して、レコードが新しい場合は、INSERTを使用するように挿入されます.それが重複している場合、新しいレコードは古いレコードに取って代わります.
INSERT IGNOREおよびREPLACEは、実装される反復処理動作に従って選択されるべきである.INSERTは、第1セットの重複記録を保持することを無視し、残りを破棄する.REPLACEは、最後の繰り返しのセットを保持し、より古いレコードを消去します.
 
二、検索結果から再記録を取り除く
方法1:
mysql> show create table user2\G
*************************** 1. row ***************************
       Table: user2
Create Table: CREATE TABLE `user2` (
  `first_name` char(20) DEFAULT NULL,
  `code` char(20) DEFAULT NULL,
  `sex` char(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

mysql> 

表に相当するデータを挿入してテストします.
mysql> insert into user2 values ('bb','BJ','N');
Query OK, 1 row affected (0.03 sec)

mysql> insert into user2 values ('bb','BJ','N');
Query OK, 1 row affected (0.02 sec)

mysql> insert into user2 values ('cc','SH','M');
Query OK, 1 row affected (0.03 sec)

mysql> insert into user2 values ('cc','SH','M');
Query OK, 1 row affected (0.03 sec)

クエリの結果から同じレコードを削除できます.
mysql> SELECT DISTINCT first_name,code FROM user2 ORDER BY first_name;
+------------+------+
| first_name | code |
+------------+------+
| bb         | BJ   |
| cc         | SH   |
+------------+------+
2 rows in set (0.00 sec)

mysql> 

代替DISTINCT法は、GROUUPBY句の列名を選択した列に追加することです.重複を削除し、指定したカラム値の一意の組み合わせを選択する効果があります.
mysql> CREATE TABLE tmp SELECT first_name,code,sex FROM user2 GROUP BY (first_name,code);         
ERROR 1786 (HY000): CREATE TABLE ... SELECT is forbidden when ENFORCE_GTID_CONSISTENCY = 1.
mysql> show variables like 'ENFORCE_GTID_CONSISTENCY';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| enforce_gtid_consistency | ON    |
+--------------------------+-------+
1 row in set (0.00 sec)

GTIDレプリケーションをオンにすると、このような実行はエラーを報告するので、GTIDレプリケーションのいくつかのパラメータをオフにする必要があります.この変数はプロファイルを変更するだけで有効になります.オンライン修正はサポートされていません.変更後、再起動してみてください.
mysql> SELECT first_name,code,sex FROM user2 ;
+------------+------+------+
| first_name | code | sex  |
+------------+------+------+
| bb         | BJ   | N    |
| bb         | BJ   | N    |
| cc         | SH   | M    |
| cc         | SH   | M    |
+------------+------+------+
4 rows in set (0.00 sec)
mysql> CREATE TABLE tmp SELECT first_name,code,sex FROM user2 GROUP BY first_name,code;
Query OK, 2 rows affected (0.44 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> 

テーブルを作成してデータを挿入できることがわかります.元のテーブルDROPを落として、仮テーブルの名前を前のテーブル名に変更します.
mysql> drop table user2;
Query OK, 0 rows affected (0.12 sec)

mysql> rename table tmp to user2;
Query OK, 0 rows affected (0.13 sec)

mysql> select * from user2;
+------------+------+------+
| first_name | code | sex  |
+------------+------+------+
| bb         | BJ   | N    |
| cc         | SH   | M    |
+------------+------+------+
2 rows in set (0.00 sec)

mysql> 

 
方法2:
テーブルから重複レコードを削除する簡単な方法は、インデックス(INDEX)またはプライマリ・キー(PRIMAY KEY)をテーブルに追加します.テーブルがすでに提供されている場合でも、このテクノロジーを使用して重複するレコードを削除できます.
mysql> SELECT * FROM user2;
+------------+------+------+
| first_name | code | sex  |
+------------+------+------+
| bb         | BJ   | N    |
| cc         | SH   | M    |
| bb         | BJ   | N    |
| cc         | SH   | M    |
+------------+------+------+
4 rows in set (0.00 sec)

mysql> ALTER IGNORE TABLE user2 ADD PRIMARY KEY (first_name,code);
Query OK, 4 rows affected (1.22 sec)
Records: 4  Duplicates: 2  Warnings: 0

mysql> SELECT * FROM user2;
+------------+------+------+
| first_name | code | sex  |
+------------+------+------+
| bb         | BJ   | N    |
| cc         | SH   | M    |
+------------+------+------+
2 rows in set (0.00 sec)

mysql> 

 
 
まとめ:
一、INSERT IGNOREとREPLACEで重複行データ処理を実現することができ、もう一つの方法は、プライマリキー(PRIMARY KEY)ではなくユニーク(UNIQUE)インデックスを追加してデータのユニークを実現することである.
二、CREATE TABLE tmp SELECT xx方式でテーブルを作成し、GTIDレプリケーションをオフにしてから実行する.オンライン上のマスタースレーブレプリケーションがGTIDに基づいている場合、インデックス(INDEX)またはプライマリキー(PRIMAY KEY)を追加してテーブルに同じ行記録を削除するしかない.
三、これらの需要は現実生活の中で必ずあるので、みんながもっとテストして、もっと多くの考えを分かち合うことを望んでいます.
 
 
作者:陸炫志出典:xuanzhiのブログhttp://www.cnblogs.com/xuanzhi201111あなたの支持はブロガーに対する最大の励ましであり、真剣に読んでくれてありがとう.本文の著作権は作者の所有に帰して、転載を歓迎して、しかしこの声明を保留してください.