概要:このチュートリアルでは、SQL UNIQUE制約を使用して、列または列のセットの値の一意性を強制する方法を学びます。
SQL UNIQUE制約とは
場合によっては、列または列のセットの値が重複しないようにする必要があります。たとえば、従業員テーブル内の重複したメールアドレスは許容できません。
メールアドレス列は主キーの一部ではないため、メールアドレス列で重複した値を防ぐ唯一の方法は、UNIQUE制約を使用することです。
定義上、SQL UNIQUE制約は、主キーに含まれない特定の列に格納された重複値を防ぐルールを定義します。
UNIQUE制約とPRIMARY KEY制約の違い
テーブルには最大で1つのPRIMARY KEY制約を持つことができますが、複数のUNIQUE制約を持つことができます。テーブルに複数のUNIQUE制約がある場合、すべてのUNIQUE制約は異なる列のセットを持つ必要があります。
PRIMARY KEY制約とは異なり、UNIQUE制約ではNULL値を許可します。NULL値が一意であるかどうかを検討するかどうかは、RDBMSによって異なります。
たとえば、MySQLはNULL値を異なる値として扱うため、UNIQUE制約に参加している列に複数のNULL値を格納できます。ただし、Microsoft SQL ServerやOracle Databaseではそうではありません。
次の表は、UNIQUE制約とPRIMARY KEY制約の違いを示しています。
許可されていません
PRIMARY KEY制約 | UNIQUE制約 | |
制約の数 | 1つ | 複数 |
NULL値 | 許可しない | 許可する |
UNIQUE制約の作成
通常、テーブルを作成するときにUNIQUE制約を作成します。次のCREATE TABLEステートメントは、username列が一意であるusersテーブルを定義します。
CREATE TABLE users (
user_id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(255) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL
);
Code language: SQL (Structured Query Language) (sql)
列にUNIQUE制約を作成するには、列定義にUNIQUEキーワードを追加する必要があります。この場合、列制約としてUNIQUE制約を作成しました。
挿入または更新する値が、username列に既に存在する値と同じ場合、RDBMSは変更を拒否し、エラーを返します。
次のステートメントは、テーブル制約構文を使用して作成されたUNIQUE制約を持つ上記のステートメントと同等です。
CREATE TABLE users (
user_id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(255) NOT NULL,
password VARCHAR(255) NOT NULL,
CONSTRAINT uc_username UNIQUE (username)
);
Code language: SQL (Structured Query Language) (sql)
この場合、CONSTRAINT句をCREATE TABLEステートメントの末尾に置きます。
既存のテーブルへのUNIQUE制約の追加
テーブルが既に存在する場合、UNIQUE制約に参加する列または列の組み合わせに一意の値が含まれているという前提条件で、列にUNIQUE制約を追加できます。
usersテーブルがusername列にUNIQUE制約が定義されていない状態で作成されたとします。username列にUNIQUE制約を追加するには、次のようにALTER TABLEステートメントを使用します。
ALTER TABLE users
ADD CONSTRAINT uc_username UNIQUE(username);
Code language: SQL (Structured Query Language) (sql)
新しい列を追加し、その列にUNIQUE制約を作成する場合は、ALTER TABLEステートメントの次の形式を使用します。
ALTER TABLE users
ADD new_column data_type UNIQUE;
Code language: SQL (Structured Query Language) (sql)
たとえば、次のステートメントは、UNIQUE制約を持つemail列をuserテーブルに追加します。
ALTER TABLE users
ADD email VARCHAR(255) UNIQUE;
Code language: SQL (Structured Query Language) (sql)
UNIQUE制約の削除
UNIQUE制約を削除するには、次のようにALTER TABLEステートメントを使用します。
ALTER TABLE table_name
DROP CONSTRAINT unique_constraint_name;
Code language: SQL (Structured Query Language) (sql)
たとえば、usersテーブルのuc_username一意制約を削除するには、次のステートメントを使用します。
ALTER TABLE users
DROP CONSTRAINT uc_username;
Code language: SQL (Structured Query Language) (sql)
このチュートリアルでは、UNIQUE制約と、それを適用して列または列のセットの値の一意性を強制する方法について学びました。