Latest web development tutorials

MySQLは、重複データを扱います

我々は、重複データを許すが、時には我々は、重複データを削除する必要がある場合には、重複するレコードいくつかのMySQLデータテーブルがあるかもしれません。

この章では、我々は、データテーブルのデータの重複を防ぐために、どのようにデータテーブル内の重複データを削除する方法を紹介します。


表示されたテーブル内の重複データを防ぎます

あなたは、データの一意性を保証するために、PRIMARY KEY(主キー)またはUNIQUE(ユニーク)インデックスのMySQLデータテーブル内の指定されたフィールドを設定することができます。

テーブルの下の索引と主キーなしで、表が複数重複したレコードが表示されることができるように:の例を試してみましょう。

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

あなたは、テーブルのフィールドのfirst_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 INTO違いIGNOREは、INSERT INTO INSERT IGNOREをして、データベースにデータを持っていない場合は、既に、データベースに存在するデータを無視データがある場合、新しいデータを挿入し、このデータをスキップすることです。 すでに隙間に挿入されたデータの目的を達成するために、データベースに存在するデータを保持することができるようになっています。

次の例では、INSERT INTOはをIGNORE使用して実装した後に間違って行くことができない、それは、データテーブルに重複挿入しません。

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)

データを挿入すると、レコードの一意性を設定した後、あなたが重複したデータを挿入する場合、エラーを返しませんINTOをIGNORE INSERT、それが唯一の警告として返します。 プライマリまたはユニークな存在は、最初に削除した場合、同じレコードにINTOをREPLACE。 次に、新しいレコードを挿入します。

データの別のセットは、唯一の方法は、以下のように、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(*)欄に記載されたもの。
  • GROUP BY句にリストされている列。
  • 句を有する繰り返し数が1より大きいセット。

重複データをフィルタリングします

あなたはユニークなデータを読み込む必要がある場合は、重複データをフィルタリングする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);