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、上書きや更新が必要なケースでは他の構文を選ぶとよいでしょう。
-
MySQLで現在の日付・時刻を挿入する方法を解説
MySQLで現在の日付や時刻をテーブルに挿入したい場合、NOW()関数を使用するのが最も簡単な方法です。この記事では、実際の例を通して具体的な手順をわかりやすく解説します。1. テーブルを作成するまず、日付・時刻を格納するためのテーブルを作成します。テーブルの作成にはCREATE TABLEコマンドを使用します。mysql> create table CurrentDateTime -> ( -> CurrentTime datetime -> ); Query OK, 0 rows affected (1.14 sec)ここでは「CurrentDateTime」という
-
MySQLでテーブルの最後の10件のレコードを取得する方法
MySQLでテーブルの末尾にある10行(最新の10件)を取得したい場合は、SELECT文とLIMIT句を組み合わせたサブクエリを利用します。この記事では、実際にテーブルを作成し、データを挿入しながら、最後の10件を取得するクエリの手順を具体的に解説します。 1. サンプルテーブルの作成 まず、動作確認用のテーブルを作成します。 mysql> create table Last10RecordsDemo -> ( -> id int, -> name varchar(100) -> ); Query OK, 0 rows affected