MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLのINSERTで行の重複を防ぐ方法【UNIQUE KEYとINSERT IGNOREの使い方】

MySQLでINSERT時にデータの重複を防ぎたい場合は、対象のカラムにUNIQUE KEY(一意キー)を設定します。UNIQUE KEYが設定されたカラムには同じ値を複数回挿入できないため、重複データを確実に防止できます。

UNIQUE KEYを設定したテーブルを作成する

まず、テーブルを作成しましょう。以下の例では、FirstNameカラムにUNIQUE KEYを設定しています。

mysql> create table DemoTable
(
    Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    FirstName varchar(30),
    UNIQUE KEY(FirstName)
);
Query OK, 0 rows affected (1.76 sec)

INSERT IGNOREでレコードを挿入する

次に、INSERT IGNOREコマンドを使ってレコードを挿入します。ここではあえて「David」という重複データも挿入しようとしていますが、FirstNameカラムにUNIQUE KEYが設定されているため、同じ値が2回登録されることはありません。

mysql> insert ignore into DemoTable(FirstName) values('Chris');
Query OK, 1 row affected (0.42 sec)
mysql> insert ignore into DemoTable(FirstName) values('David');
Query OK, 1 row affected (0.12 sec)
mysql> insert ignore into DemoTable(FirstName) values('Chris');
Query OK, 0 rows affected, 1 warning (0.17 sec)
mysql> insert ignore into DemoTable(FirstName) values('Sam');
Query OK, 1 row affected (0.11 sec)
mysql> insert ignore into DemoTable(FirstName) values('David');
Query OK, 0 rows affected, 1 warning (0.07 sec)

注目したいのは、「Chris」と「David」を2回目に挿入しようとした際に「Query OK, 0 rows affected, 1 warning」と表示されている点です。通常のINSERTならUNIQUE KEY制約違反でエラーになり処理が中断されますが、INSERT IGNOREを使うとエラーではなく警告に変わり、その行の挿入が単純にスキップされます。

挿入結果を確認する

SELECT文ですべてのレコードを表示してみましょう。

mysql> select *from DemoTable;

実行結果は以下の通りです。

+----+-----------+
| Id | FirstName |
+----+-----------+
|  1 | Chris     |
|  2 | David     |
|  4 | Sam       |
+----+-----------+
3 rows in set (0.00 sec)

出力を見ると、「Chris」と「David」はそれぞれ1件ずつしか登録されておらず、Id 3と5が飛ばされています。これはINSERT IGNOREが重複を検知して挿入を無視したためで、AUTO_INCREMENTの採番だけは進んでいることがわかります。

補足:用途に応じた他の選択肢

重複時の動作を制御したい場合は、以下の構文も活用できます。

  • REPLACE INTO:重複が発生した場合、既存の行を削除してから新しい行を挿入します。
  • INSERT ... ON DUPLICATE KEY UPDATE:重複が発生した場合、既存の行を指定した内容で更新します。

単純に重複を無視したいならINSERT IGNORE、上書きや更新が必要なケースでは他の構文を選ぶとよいでしょう。

  1. MySQLで現在の日付・時刻を挿入する方法を解説

    MySQLで現在の日付や時刻をテーブルに挿入したい場合、NOW()関数を使用するのが最も簡単な方法です。この記事では、実際の例を通して具体的な手順をわかりやすく解説します。1. テーブルを作成するまず、日付・時刻を格納するためのテーブルを作成します。テーブルの作成にはCREATE TABLEコマンドを使用します。mysql> create table CurrentDateTime -> ( -> CurrentTime datetime -> ); Query OK, 0 rows affected (1.14 sec)ここでは「CurrentDateTime」という

  2. MySQLでテーブルの最後の10件のレコードを取得する方法

    MySQLでテーブルの末尾にある10行(最新の10件)を取得したい場合は、SELECT文とLIMIT句を組み合わせたサブクエリを利用します。この記事では、実際にテーブルを作成し、データを挿入しながら、最後の10件を取得するクエリの手順を具体的に解説します。 1. サンプルテーブルの作成 まず、動作確認用のテーブルを作成します。 mysql> create table Last10RecordsDemo -> ( -> id int, -> name varchar(100) -> ); Query OK, 0 rows affected