MySQLで重複データの二重挿入を防ぐ方法【UNIQUE制約の使い方】
MySQLで重複エントリ(二重挿入)を防ぎたい
データベースを運用していると、同じレコードが誤って何度も登録されてしまう「二重挿入」の問題に直面することがあります。MySQLでは、UNIQUE制約(一意制約)を追加することで、重複したデータの登録を自動的に防止できます。
この記事では、実際にテーブルを作成し、UNIQUE制約を設定して、重複挿入がどのように防止されるのかを順番に解説します。
1. テーブルを作成する
まずは検証用のテーブル「DemoTable」を作成しましょう。IdとNameという2つのカラムを持つシンプルな構成です。
mysql> create table DemoTable
(
Id int,
Name varchar(100)
);
Query OK, 0 rows affected (0.79 sec)2. UNIQUE制約を追加する
次に、ALTER TABLE文を使って、IdカラムとNameカラムの組み合わせに対してUNIQUE制約を追加します。これにより、「Id」と「Name」が完全に一致するレコードは登録できなくなります。
mysql> alter table DemoTable add constraint id_NameUnKey UNIQUE(Id,Name); Query OK, 0 rows affected (0.82 sec) Records: 0 Duplicates: 0 Warnings: 0
ここでのポイントは、単一カラムだけでなく複数カラムを組み合わせたUNIQUE制約も設定できることです。上記の例では、Idが同じでもNameが異なれば登録可能ですが、両方が同じ場合は拒否されます。
3. レコードを挿入して動作を確認する
それでは、INSERT文でレコードを登録してみましょう。同じデータを再度挿入しようとした瞬間に、「Duplicate entry(重複エントリ)」エラーが発生することを確認できます。
mysql> insert into DemoTable values(11,'John'); Query OK, 1 row affected (0.18 sec) mysql> insert into DemoTable values(12,'John'); Query OK, 1 row affected (0.21 sec) mysql> insert into DemoTable values(11,'John'); ERROR 1062 (23000): Duplicate entry '11-John' for key 'id_NameUnKey'
3つ目のINSERT文では、Id=11かつName='John'という組み合わせがすでに存在するため、ERROR 1062 (23000)が返され、登録が拒否されました。これがUNIQUE制約による重複防止の仕組みです。
4. 登録されたレコードを確認する
最後に、SELECT文でテーブルの中身を確認してみましょう。
mysql> select *from DemoTable;
実行結果は以下の通りです。
+------+------+ | Id | Name | +------+------+ | 11 | John | | 12 | John | +------+------+ 2 rows in set (0.00 sec)
重複しようとしたレコードは登録されず、正常な2件だけが格納されていることがわかります。
まとめ
- UNIQUE制約を追加することで、MySQLの二重挿入(重複エントリ)を防げる。
- ALTER TABLE文と
add constraintを使えば、既存のテーブルにも後から制約を追加できる。 - 複数カラムを組み合わせたUNIQUE制約(複合一意キー)にも対応している。
アプリケーション側で重複チェックを行うだけでなく、データベース側でもUNIQUE制約による防御をしておくことで、より堅牢なデータ管理が実現できます。
-
【MySQL】レコードの存在確認と重複時の列の上書き更新を行う方法(INSERT ... ON DUPLICATE KEY UPDATE)
MySQLで「レコードが存在しない場合は挿入し、すでに存在する場合は指定した列の値を上書きしたい」というケースがあります。このような場合には、INSERT ... ON DUPLICATE KEY UPDATE 構文を使用します。この記事では、具体的なサンプルコードとともにその使い方を解説します。サンプルテーブルの作成まず、FirstName 列に UNIQUE キーを設定したテーブルを作成します。UNIQUE キーがあることで、重複データの挿入が検出されるようになります。mysql> create table DemoTable1891 ( FirstName varc
-
MySQLでINSERT前にトリガーを使って挿入を停止・キャンセルする方法
BEFORE INSERTトリガーで挿入を停止する方法 MySQLでは、BEFORE INSERTトリガーとSIGNAL SQLSTATEを組み合わせることで、INSERT処理を実行前に中断(キャンセル)できます。トリガー内で条件をチェックし、条件を満たした場合にエラーを発生させることで、その挿入自体が取り消されます。 基本構文 構文は以下の通りです。 delimiter // create trigger yourTriggerName before insert on yourTableName FOR EACH ROW BEGIN yourStateme