サンプルコード:MySQLで複数の列にユニーク制約を設定する
MySQLで複数の列にユニーク制約を指定するには、UNIQUE
制約を使用します。この制約は、指定された列の組み合わせがテーブル内で一意であることを保証します。
方法は2つあります。
CREATE TABLE ステートメントを使用する
CREATE TABLE テーブル名 (
カラム名1 型1,
カラム名2 型2,
...
UNIQUE (カラム名1, カラム名2, ...)
);
例
CREATE TABLE users (
id INT PRIMARY KEY,
username VARCHAR(255) UNIQUE,
email VARCHAR(255) UNIQUE
);
この例では、users
テーブルにはusername
とemail
列にユニーク制約が設定されています。つまり、同じusername
または同じemail
を持つユーザーは2人以上登録できません。
既存のテーブルにユニーク制約を追加するには、ALTER TABLE
ステートメントを使用します。
ALTER TABLE テーブル名 ADD UNIQUE (カラム名1, カラム名2, ...);
ALTER TABLE users ADD UNIQUE (country, city);
この例では、users
テーブルにcountry
とcity
列の組み合わせにユニーク制約を追加しています。
複合ユニーク制約を使用すると、単一の列よりも多くの情報に基づいてデータの重複を防ぐことができます。
注意点
- 複合ユニーク制約を設定すると、インデックスが自動的に作成されます。
- NULL値を含む行は、ユニーク制約の違反とは見なされません。
- 複合ユニーク制約を変更する前に、その制約に依存する他のオブジェクト (たとえば、外部キー) を更新する必要があります。
補足
- MySQL 5.7以降では、条件付きのユニーク制約を設定することもできます。
- 複合ユニーク制約は、主キー制約と似ていますが、主キー制約はNULL値を許容しない点が異なります。
CREATE TABLE users (
id INT PRIMARY KEY,
username VARCHAR(255) UNIQUE,
email VARCHAR(255) UNIQUE,
country VARCHAR(255),
city VARCHAR(255),
UNIQUE (country, city)
);
この例では、users
テーブルには以下の列と制約が設定されています。
id
: 主キーusername
: ユニーク制約country
: 複合ユニーク制約の一部
CREATE TABLE users (
id INT PRIMARY KEY,
username VARCHAR(255),
email VARCHAR(255)
);
ALTER TABLE users ADD UNIQUE (country, city);
email
: なし
複合ユニーク制約の例
- 同じ国に住む2人のユーザーは、同じ名前を持つことはできません。
複合ユニーク制約を指定するその他の方法
CREATE TABLE テーブル名 (
カラム名1 型1,
カラム名2 型2,
...
UNIQUE KEY キー名 (カラム名1, カラム名2, ...)
);
CREATE TABLE users (
id INT PRIMARY KEY,
username VARCHAR(255),
email VARCHAR(255),
UNIQUE KEY ux_username (username),
UNIQUE KEY ux_email (email)
);
この例では、users
テーブルにはusername
とemail
列にそれぞれユニークキーが設定されています。
PRIMARY KEY 制約を使用する
複合主キーは、複合ユニーク制約と同じように機能します。
CREATE TABLE テーブル名 (
カラム名1 型1,
カラム名2 型2,
...
PRIMARY KEY (カラム名1, カラム名2, ...)
);
CREATE TABLE users (
username VARCHAR(255),
email VARCHAR(255),
PRIMARY KEY (username, email)
);
CHECK 制約を使用する
CREATE TABLE テーブル名 (
カラム名1 型1,
カラム名2 型2,
...
CHECK (カラム名1 IS NOT NULL AND カラム名2 IS NOT NULL AND CONCAT(カラム名1, カラム名2) UNIQUE)
);
CREATE TABLE users (
username VARCHAR(255),
email VARCHAR(255),
CHECK (username IS NOT NULL AND email IS NOT NULL AND CONCAT(username, email) UNIQUE)
);
- 複合ユニーク制約と複合主キーは、データの重複を防ぐために使用されます。
- UNIQUE KEY 制約は、インデックスを作成するために使用されます。
- CHECK 制約は、より複雑な制約を定義するために使用されます。
- 複合ユニーク制約、複合主キー、UNIQUE KEY 制約は、NULL値を許容しません。
- CHECK 制約は、NULL値を許容できます。
mysql unique-constraint composite-key