MySQLで重複行の挿入を防ぐ方法|UNIQUE制約の使い方を解説
MySQLでテーブルに重複した行が挿入されるのを防ぎたい場合、UNIQUE制約を活用するのが最も簡単で効果的な方法です。UNIQUE制約を設定したカラム(またはカラムの組み合わせ)に同じ値を持つデータを挿入しようとすると、MySQLが自動的にエラーを返して挿入を阻止してくれます。
UNIQUE制約を追加する構文
既存のテーブルにUNIQUE制約を追加するには、ALTER TABLE文を使用します。構文は以下のとおりです。
ALTER TABLE テーブル名 ADD UNIQUE(カラム名1, カラム名2, ...N);
単一のカラムにも、複数のカラムを組み合わせた複合 UNIQUE キーにも設定できるため、業務要件に応じて柔軟に対応できます。
サンプルテーブルの作成
それでは、実際にUNIQUE制約の動作を確認するためのテーブルを作成してみましょう。以下のクエリを実行します。
mysql> create table avoidInsertingDuplicateRows
-> (
-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> FirstValue int,
-> SecondValue int
-> );
Query OK, 0 rows affected (0.53 sec)このテーブルでは、Idカラムが自動採番の主キー、FirstValueとSecondValueが通常のint型カラムとして定義されています。
テーブル構造の確認
DESCコマンドを使って、作成したテーブルの構造を確認してみます。
mysql> desc avoidInsertingDuplicateRows;
実行結果は以下のとおりです。
+-------------+---------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------------+---------+------+-----+---------+----------------+ | Id | int(11) | NO | PRI | NULL | auto_increment | | FirstValue | int(11) | YES | | NULL | | | SecondValue | int(11) | YES | | NULL | | +-------------+---------+------+-----+---------+----------------+ 3 rows in set (0.00 sec)
重複行の挿入を防ぐクエリの実行
ここで、FirstValueとSecondValueの2つのカラムにUNIQUE制約を設定します。これにより、この2つの値の組み合わせが完全に同じレコードは挿入できなくなります。
mysql> ALTER TABLE avoidInsertingDuplicateRows ADD UNIQUE(FirstValue, SecondValue); Query OK, 0 rows affected (0.45 sec) Records: 0 Duplicates: 0 Warnings: 0
それでは、INSERT文でレコードを挿入して動作を確認してみましょう。まず1件目のデータを挿入します。
mysql> insert into avoidInsertingDuplicateRows(FirstValue,SecondValue) values(10,20); Query OK, 1 row affected (0.24 sec)
1件目は問題なく挿入されました。次に、まったく同じ値の組み合わせ(10と20)を持つレコードを再度挿入してみます。
mysql> insert into avoidInsertingDuplicateRows(FirstValue,SecondValue) values(10,20); ERROR 1062 (23000): Duplicate entry '10-20' for key 'FirstValue'
このように、ERROR 1062 (23000): Duplicate entry というエラーが発生し、重複データの挿入が自動的にブロックされました。エラーメッセージには重複した値('10-20')も表示されるため、原因の特定も容易です。
挿入されたレコードの確認
最後に、SELECT文でテーブル内の全レコードを表示して、データの状態を確認します。
mysql> select *from avoidInsertingDuplicateRows;
実行結果は以下のとおりです。
+----+------------+-------------+ | Id | FirstValue | SecondValue | +----+------------+-------------+ | 1 | 10 | 20 | +----+------------+-------------+ 1 row in set (0.00 sec)
重複挿入が試みられたにもかかわらず、テーブルには最初の1件だけが登録されていることがわかります。
まとめ
MySQLで重複行の挿入を防ぐには、ALTER TABLE文でUNIQUE制約を追加するのが最もシンプルな方法です。データベースレベルで制約をかけておけば、アプリケーション側の実装ミスや同時実行による重複登録も確実に防ぐことができます。なお、重複時にエラーではなく既存レコードの更新や無視を行いたい場合は、INSERT ... ON DUPLICATE KEY UPDATE や INSERT IGNORE と組み合わせて使うと、さらに柔軟な運用が可能になります。
-
MySQLでテーブルの最後の10件のレコードを取得する方法
MySQLでテーブルの末尾にある10行(最新の10件)を取得したい場合は、SELECT文とLIMIT句を組み合わせたサブクエリを利用します。この記事では、実際にテーブルを作成し、データを挿入しながら、最後の10件を取得するクエリの手順を具体的に解説します。 1. サンプルテーブルの作成 まず、動作確認用のテーブルを作成します。 mysql> create table Last10RecordsDemo -> ( -> id int, -> name varchar(100) -> ); Query OK, 0 rows affected
-
MySQLでテーブルから順序付けられた3行のみを取得する方法
ORDER BY句とLIMITを組み合わせて順序付きの3行を取得する MySQLでテーブルから特定の順序で並べ替えた行を、指定した件数だけ取得したい場合は、ORDER BY句とLIMITを組み合わせます。ここでは、従業員IDの降順に並べ替えた上位3行を取得する具体例を紹介します。 1. サンプルテーブルの作成 まず、動作確認用のテーブルを作成しましょう。 mysql> create table DemoTable1551 -> ( -> EmployeeId int NOT NULL AUTO_INCREMENT PRIM