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

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制約による防御をしておくことで、より堅牢なデータ管理が実現できます。

  1. 【MySQL】レコードの存在確認と重複時の列の上書き更新を行う方法(INSERT ... ON DUPLICATE KEY UPDATE)

    MySQLで「レコードが存在しない場合は挿入し、すでに存在する場合は指定した列の値を上書きしたい」というケースがあります。このような場合には、INSERT ... ON DUPLICATE KEY UPDATE 構文を使用します。この記事では、具体的なサンプルコードとともにその使い方を解説します。サンプルテーブルの作成まず、FirstName 列に UNIQUE キーを設定したテーブルを作成します。UNIQUE キーがあることで、重複データの挿入が検出されるようになります。mysql> create table DemoTable1891 ( FirstName varc

  2. MySQLでINSERT前にトリガーを使って挿入を停止・キャンセルする方法

    BEFORE INSERTトリガーで挿入を停止する方法 MySQLでは、BEFORE INSERTトリガーとSIGNAL SQLSTATEを組み合わせることで、INSERT処理を実行前に中断(キャンセル)できます。トリガー内で条件をチェックし、条件を満たした場合にエラーを発生させることで、その挿入自体が取り消されます。 基本構文 構文は以下の通りです。 delimiter // create trigger yourTriggerName before insert on yourTableName FOR EACH ROW BEGIN yourStateme