MySQLi-重複の処理

テーブルまたは結果セットに重複レコードが含まれる場合があります。許可される場合もありますが、重複レコードを停止する必要がある場合もあります。場合によっては、重複するレコードを識別してテーブルから削除する必要があります。この章では、テーブルで重複レコードが発生しないようにする方法と、既存の重複レコードを削除する方法について説明します。

テーブル内での重複の発生の防止

あなたは使用することができます PRIMARY KEY または UNIQUE重複レコードを停止するための適切なフィールドを持つテーブルのインデックス。1つの例を見てみましょう。次の表にはそのようなインデックスまたは主キーが含まれていないため、first_nameとlast_nameのレコードが重複する可能性があります。

CREATE TABLE person_tbl (
   first_name CHAR(20),
   last_name CHAR(20),
   sex CHAR(10)
);

同じ姓名の値を持つ複数のレコードがこのテーブルに作成されないようにするには、その定義にPRIMARYKEYを追加します。これを行うとき、PRIMARY KEYはNULL値を許可しないため、インデックス付き列をNOTNULLとして宣言する必要もあります-

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

通常、テーブルに一意のインデックスが存在すると、インデックスを定義する1つまたは複数の列の既存のレコードと重複するレコードをテーブルに挿入すると、エラーが発生します。

使用する INSERT IGNORE のではなく INSERT。レコードが既存のレコードと重複しない場合、MySQLiは通常どおりそのレコードを挿入します。レコードが重複している場合、IGNOREキーワードは、エラーを生成せずにサイレントにレコードを破棄するようにMySQLiに指示します。

次の例ではエラーが発生せず、同時に重複レコードが挿入されません。

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)

使用する REPLACEINSERTではなく。レコードが新しい場合は、INSERTと同じように挿入されます。重複している場合は、新しいレコードが古いレコードを置き換えます-

mysql> REPLACE INTO person_tbl (last_name, first_name)
   -> VALUES( 'Ajay', 'Kumar');
Query OK, 1 row affected (0.00 sec)

mysql> REPLACE INTO person_tbl (last_name, first_name)
   -> VALUES( 'Ajay', 'Kumar');
Query OK, 2 rows affected (0.00 sec)

INSERT IGNOREとREPLACEは、実行する重複処理動作に応じて選択する必要があります。INSERT IGNOREは、複製されたレコードのセットの最初のものを保持し、残りを破棄します。REPLACEは、一連の重複の最後を保持し、以前の重複を消去します。

一意性を強制する別の方法は、PRIMARYKEYではなく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(*)とともに列選択リストにリストします。

  • GROUPBY句の列もリストします。

  • グループ数を1より大きくすることを要求することにより、一意の値を削除するHAVING句を追加します。

クエリ結果からの重複の排除:

使用できます DISTINCT SELECTステートメントとともに、テーブルで使用可能な一意のレコードを検索します。

mysql> SELECT DISTINCT last_name, first_name
   -> FROM person_tbl
   -> ORDER BY last_name;

DISTINCTの代わりに、選択している列に名前を付けるGROUPBY句を追加することもできます。これには、重複を削除し、指定された列の値の一意の組み合わせのみを選択する効果があります-

mysql> SELECT last_name, first_name
   -> FROM person_tbl
   -> GROUP BY (last_name, first_name);

テーブル置換を使用した重複の削除

テーブルに重複レコードがあり、そのテーブルからすべての重複レコードを削除する場合の手順は次のとおりです。

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またはPRIMAYKEYを追加することです。このテーブルがすでに利用可能である場合でも、この手法を使用して重複レコードを削除でき、将来的にも安全になります。

mysql> ALTER IGNORE TABLE person_tbl 
   -> ADD PRIMARY KEY (last_name, first_name);