MySQLでデータベースを設計する際、「同じメールアドレスで複数のユーザーが登録されてしまった」といった問題に直面したことはありませんか?
このような重複データの問題を解決するのが「UNIQUE KEY(ユニーク制約)」です。本記事では、MySQL初心者の方でも理解できるよう、UNIQUE KEYの基本から実践的な使い方まで分かりやすく解説します。
UNIQUE KEYとは?基本を理解しよう
UNIQUE KEY(ユニーク制約)とは、テーブルの特定のカラムに重複した値が入らないようにする制約のことです。
具体例で理解する
例えば、ユーザー登録システムを考えてみましょう。
CREATE TABLE users (
id INT PRIMARY KEY,
email VARCHAR(255),
username VARCHAR(50)
);
この状態だと、以下のような問題が発生します。
INSERT INTO users VALUES (1, 'tanaka@example.com', 'tanaka');
INSERT INTO users VALUES (2, 'tanaka@example.com', 'sato'); -- 同じメールで登録できてしまう!
これを防ぐために、emailカラムにUNIQUE KEYを設定します。
CREATE TABLE users (
id INT PRIMARY KEY,
email VARCHAR(255) UNIQUE,
username VARCHAR(50) UNIQUE
);
こうすることで、同じメールアドレスやユーザー名での重複登録を防げます。
UNIQUE KEYとPRIMARY KEYの違い
MySQL初心者がよく混乱するのが、UNIQUE KEYとPRIMARY KEYの違いです。以下の表で違いを整理しましょう。
| 項目 | PRIMARY KEY | UNIQUE KEY |
|---|---|---|
| テーブル内の数 | 1つだけ | 複数設定可能 |
| NULL値 | 不可 | 可(複数のNULL可) |
| 用途 | レコードの一意識別 | 重複防止 |
| 自動インデックス | 作成される | 作成される |
使い分けのポイント
- PRIMARY KEY: ユーザーIDなど、レコードを一意に識別する主キー
- UNIQUE KEY: メールアドレス、ユーザー名など、重複を許可したくないカラム
UNIQUE KEYの設定方法
1. テーブル作成時に設定する方法
最も一般的な方法です。カラム定義の後ろにUNIQUEを追加します。
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
email VARCHAR(255) UNIQUE,
username VARCHAR(50) UNIQUE KEY,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
2. 複合UNIQUE KEY(複数カラムの組み合わせ)
複数のカラムの組み合わせで一意性を保証したい場合に使用します。
CREATE TABLE enrollments (
id INT AUTO_INCREMENT PRIMARY KEY,
student_id INT,
course_id INT,
enrolled_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY unique_enrollment (student_id, course_id)
);
この例では、「同じ学生が同じ講座に重複して登録できない」という制約を実現しています。
3. 既存のテーブルにUNIQUE KEYを追加する方法
運用中のテーブルに後からUNIQUE KEYを追加することもできます。
-- 単一カラムにUNIQUE KEYを追加
ALTER TABLE users ADD UNIQUE KEY (phone_number);
-- 複合UNIQUE KEYを追加(名前付き)
ALTER TABLE orders ADD UNIQUE KEY unique_order_date (customer_id, order_date);
4. UNIQUE KEYの削除方法
設定したUNIQUE KEYを削除する場合は、以下のようにします。
-- UNIQUE KEYの名前を確認
SHOW INDEX FROM users;
-- UNIQUE KEYを削除
ALTER TABLE users DROP INDEX email;
UNIQUE KEYの実践的な使用例
例1: 会員管理システム
CREATE TABLE members (
id INT AUTO_INCREMENT PRIMARY KEY,
email VARCHAR(255) UNIQUE NOT NULL,
phone VARCHAR(20) UNIQUE,
member_code VARCHAR(50) UNIQUE NOT NULL,
name VARCHAR(100),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
ポイント:
- emailとmember_codeは必須かつ一意
- phoneは任意だが、登録する場合は一意
例2: 商品管理システム
CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
product_code VARCHAR(50) UNIQUE NOT NULL,
jan_code VARCHAR(13) UNIQUE,
name VARCHAR(200),
price DECIMAL(10, 2),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
ポイント:
- 商品コードは必須かつ一意
- JANコードは任意だが、登録する場合は一意
例3: SNSのフォロー機能
CREATE TABLE follows (
id INT AUTO_INCREMENT PRIMARY KEY,
follower_id INT NOT NULL,
followee_id INT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY unique_follow (follower_id, followee_id),
FOREIGN KEY (follower_id) REFERENCES users(id),
FOREIGN KEY (followee_id) REFERENCES users(id)
);
ポイント:
- 同じユーザーを2回フォローできないようにする
- follower_idとfollowee_idの組み合わせで一意性を保証
UNIQUE KEYとNULL値の扱い
UNIQUE KEYの重要な特徴として、NULL値は複数許可されるという点があります。
CREATE TABLE products (
id INT PRIMARY KEY,
name VARCHAR(100),
barcode VARCHAR(50) UNIQUE
);
-- 以下は全て成功する
INSERT INTO products VALUES (1, '商品A', '1234567890');
INSERT INTO products VALUES (2, '商品B', NULL);
INSERT INTO products VALUES (3, '商品C', NULL); -- NULLは複数OK
INSERT INTO products VALUES (4, '商品D', '1234567890'); -- エラー!重複
NULL値を許可したくない場合は、NOT NULL制約を併用します。
CREATE TABLE products (
id INT PRIMARY KEY,
name VARCHAR(100),
barcode VARCHAR(50) UNIQUE NOT NULL -- NULLを許可しない
);
UNIQUE KEY使用時の注意点
1. パフォーマンスへの影響
UNIQUE KEYを設定すると、自動的にインデックスが作成されます。これには以下の影響があります。
メリット:
- 検索速度が向上する
- データの整合性が保証される
デメリット:
- INSERT/UPDATE時にチェック処理が発生し、わずかに遅くなる
- インデックス分のディスク容量が必要
2. エラーハンドリング
UNIQUE制約違反が発生した場合、エラーが返されます。アプリケーション側で適切に処理しましょう。
-- エラー例
-- ERROR 1062 (23000): Duplicate entry 'tanaka@example.com' for key 'email'
3. 大文字小文字の区別
MySQLのデフォルト設定(utf8mb4_general_ci)では、UNIQUE KEYは大文字小文字を区別しません。
INSERT INTO users (email) VALUES ('Test@example.com');
INSERT INTO users (email) VALUES ('test@example.com'); -- エラー!同じと見なされる
まとめ
UNIQUE KEYは、MySQLでデータの一意性を保証するための重要な機能です。
覚えておきたいポイント:
- 重複データを防ぐための制約
- テーブルに複数設定可能
- NULL値は複数許可される
- PRIMARY KEYとは異なる役割
- 自動的にインデックスが作成される
適切にUNIQUE KEYを活用することで、データの整合性を保ちながら、信頼性の高いデータベース設計が可能になります。