MySQLで行の一意性を保証する方法|UNIQUE制約の使い方を解説
MySQLでテーブル内の行が重複しないようにするには、UNIQUE制約(一意制約)を使用します。UNIQUEインデックスを設定すると、指定したカラムの組み合わせが完全に一致する行の挿入が拒否され、データの整合性を保つことができます。
サンプルテーブルの作成
まず、動作確認用のテーブルを作成しましょう。
mysql> create table DemoTable1580
-> (
-> id int,
-> Name varchar(20),
-> Age int
-> );
Query OK, 0 rows affected (0.73 sec)
UNIQUE制約の追加
次に、ALTER TABLE文を使って、id・Name・Ageの3つのカラムに対して一意インデックスを追加します。これにより、これら3つの値がすべて同じ行は登録できなくなります。
mysql> alter table DemoTable1580 add unique index(id,Name,Age);
Query OK, 0 rows affected (0.45 sec)
Records: 0 Duplicates: 0 Warnings: 0
レコードの挿入と重複チェック
INSERT文でいくつかレコードを挿入してみます。
mysql> insert into DemoTable1580 values(101,'Chris',21);
Query OK, 1 row affected (0.24 sec)
mysql> insert into DemoTable1580 values(102,'Chris',21);
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable1580 values(102,'David',21);
Query OK, 1 row affected (0.49 sec)
mysql> insert into DemoTable1580 values(101,'Chris',21);
ERROR 1062 (23000): Duplicate entry '101-Chris-21' for key 'id'
4件目のINSERTでは、id=101、Name='Chris'、Age=21という組み合わせがすでに存在するため、「ERROR 1062」の重複エラーが発生し、挿入は拒否されました。このように、UNIQUE制約によって重複データの登録を自動的に防ぐことができます。
登録済みデータの確認
SELECT文でテーブル内の全レコードを表示してみましょう。
mysql> select * from DemoTable1580;
実行結果は以下の通りです。
+------+-------+------+
| id | Name | Age |
+------+-------+------+
| 101 | Chris | 21 |
| 102 | Chris | 21 |
| 102 | David | 21 |
+------+-------+------+
3 rows in set (0.00 sec)
まとめ
複数カラムを組み合わせたUNIQUEインデックスを追加することで、それらの値がすべて同一である行の重複を防げます。1つのカラムだけが同じでも、他のカラムが異なれば問題なく登録できます。マスターデータやユーザー情報など、重複を許したくないテーブルには積極的に活用しましょう。
-
MySQLのSELECTクエリで別テーブルに存在しない行を抽出する方法(NATURAL LEFT JOIN活用)
MySQLのSELECTクエリで別テーブルに存在しない行を抽出する方法データベースの運用では、「片方のテーブルには存在するが、もう片方のテーブルには存在しないレコード」を抽出したい場面がよくあります。この記事では、2つのテーブルを作成し、NATURAL LEFT JOINを活用して差分の行を取得する方法を、実際のサンプルコードとともにわかりやすく解説します。1. 最初のテーブルを作成するまずは比較元となる最初のテーブルを作成します。 mysql> create table FirstTableDemo -> ( -> id int, -> name v
-
MySQLでテーブルの最後の10件のレコードを取得する方法
MySQLでテーブルの末尾にある10行(最新の10件)を取得したい場合は、SELECT文とLIMIT句を組み合わせたサブクエリを利用します。この記事では、実際にテーブルを作成し、データを挿入しながら、最後の10件を取得するクエリの手順を具体的に解説します。 1. サンプルテーブルの作成 まず、動作確認用のテーブルを作成します。 mysql> create table Last10RecordsDemo -> ( -> id int, -> name varchar(100) -> ); Query OK, 0 rows affected