Summary: このチュートリアルでは、SQL Server の UNIQUE
制約を使用して、列や列のグループに含まれるデータの一意性を確保する方法を学びます。
Introduction to SQL Server UNIQUE constraint
SQL ServerのUNIQUE
制約を使用すると、列や列のグループに格納されているデータが、テーブルの行の中で一意であることを保証することができます。
次のステートメントは、email
hr.persons
テーブルの行の間で一意であるテーブルを作成します。
Code language: SQL (Structured Query Language) (sql)CREATE SCHEMA hr;GOCREATE TABLE hr.persons( person_id INT IDENTITY PRIMARY KEY, first_name VARCHAR(255) NOT NULL, last_name VARCHAR(255) NOT NULL, email VARCHAR(255) UNIQUE);
この構文では、UNIQUE
UNIQUE
制約を定義することもできます。
Code language: SQL (Structured Query Language) (sql)CREATE TABLE hr.persons( person_id INT IDENTITY PRIMARY KEY, first_name VARCHAR(255) NOT NULL, last_name VARCHAR(255) NOT NULL, email VARCHAR(255), UNIQUE(email));
裏では、SQL ServerはUNIQUE
UNIQUE
制約に参加している列に格納されているデータの一意性を強制しています。 そのため、重複する行を挿入しようとすると、SQL Serverはその変更を拒否し、UNIQUE
制約に違反しているというエラーメッセージを返します。
次のステートメントは、hr.persons
テーブルに新しい行を挿入します:
Code language: SQL (Structured Query Language) (sql)INSERT INTO hr.persons(first_name, last_name, email)VALUES('John','Doe','[email protected]');
このステートメントは期待どおりに動作します。
Code language: SQL (Structured Query Language) (sql)INSERT INTO hr.persons(first_name, last_name, email)VALUES('Jane','Doe','[email protected]');
SQL Server は次のエラーメッセージを発行しました:
Code language: Shell Session (shell)Violation of UNIQUE KEY constraint 'UQ__persons__AB6E616417240E4E'. Cannot insert duplicate key in object 'hr.persons'. The duplicate key value is ([email protected]).
UNIQUE
制約に個別の名前を指定しない場合、SQL Server は自動的にその名前を生成します。 この例では、制約名はUQ__persons__AB6E616417240E4E
となっており、あまり読みやすくありません。
UNIQUE
CONSTRAINT
キーワードを使用します。
Code language: SQL (Structured Query Language) (sql)CREATE TABLE hr.persons ( person_id INT IDENTITY PRIMARY KEY, first_name VARCHAR(255) NOT NULL, last_name VARCHAR(255) NOT NULL, email VARCHAR(255), CONSTRAINT unique_email UNIQUE(email));
UNIQUE
制約に特定の名前を割り当てることで、次のようなメリットがあります。
- エラーメッセージを分類しやすくなります。
- 制約を変更したいときに、その制約名を参照することができます。 PRIMARY KEY 制約
UNIQUE
PRIMARY KEY
PRIMARY KEY
を使用したほうがよいでしょう。UNIQUE
PRIMARY KEY
UNIQUE
制約を使用してください。PRIMARY KEY
UNIQUE
NULL
UNIQUE
NULL
NULL
しか許可しません。次のステートメントは、
email
NULL
である行を挿入します。Code language: SQL (Structured Query Language) (sql)INSERT INTO hr.persons(first_name, last_name)VALUES('John','Smith');
ここで、
email
NULL
を挿入しようとすると、エラーが発生します。Code language: SQL (Structured Query Language) (sql)INSERT INTO hr.persons(first_name, last_name)VALUES('Lily','Bush');
以下のような出力になります。
Code language: SQL (Structured Query Language) (sql)Violation of UNIQUE KEY constraint 'UQ__persons__AB6E616417240E4E'. Cannot insert duplicate key in object 'hr.persons'. The duplicate key value is (<NULL>).
列のグループに対する UNIQUE 制約
列のグループに対する
UNIQUE
制約を定義するには、次のように列名をカンマで区切ってテーブル制約として記述します。Code language: SQL (Structured Query Language) (sql)CREATE TABLE table_name ( key_column data_type PRIMARY KEY, column1 data_type, column2 data_type, column3 data_type, ..., UNIQUE (column1,column2));
以下の例では、
UNIQUE
person_id
skill_id
から構成されます。Code language: SQL (Structured Query Language) (sql)CREATE TABLE hr.person_skills ( id INT IDENTITY PRIMARY KEY, person_id int, skill_id int, updated_at DATETIME, UNIQUE (person_id, skill_id));
既存の列に UNIQUE 制約を追加する
テーブル内の既存の列や列のグループに
UNIQUE
制約を追加すると、SQL Server はまずこれらの列の既存のデータを調べ、すべての値が一意であることを確認します。 もしSQL Serverが重複した値を見つけた場合は、エラーを返し、UNIQUE
制約を追加しません。以下は、テーブルに
UNIQUE
制約を追加する構文を示しています。Code language: SQL (Structured Query Language) (sql)CREATE TABLE hr.persons ( person_id INT IDENTITY PRIMARY KEY, first_name VARCHAR(255) NOT NULL, last_name VARCHAR(255) NOT NULL, email VARCHAR(255), phone VARCHAR(20),);
以下のステートメントは、
UNIQUE
email
列に追加します。Code language: SQL (Structured Query Language) (sql)ALTER TABLE hr.personsADD CONSTRAINT unique_email UNIQUE(email);
同様に、次のステートメントは、
UNIQUE
制約を電話番号の列に追加します。Code language: SQL (Structured Query Language) (sql)ALTER TABLE hr.personsADD CONSTRAINT unique_phone UNIQUE(phone);
Delete UNIQUE constraints
UNIQUE
ALTER TABLE DROP CONSTRAINT
ステートメントを使用します。Code language: SQL (Structured Query Language) (sql)ALTER TABLE table_nameDROP CONSTRAINT constraint_name;
以下のステートメントは、hr.personテーブルから
unique_phone
制約を削除します。person table:Code language: SQL (Structured Query Language) (sql)ALTER TABLE hr.personsDROP CONSTRAINT unique_phone;
UNIQUE制約の修正
SQL Serverには、
UNIQUE
制約を修正するための直接的なステートメントはありませんので、制約を変更したい場合には、まず制約を削除し、再作成する必要があります。このチュートリアルでは、SQL Serverの
UNIQUE
制約を使用して、列または列のグループに含まれるデータが一意であることを確認する方法を学びましたこのチュートリアルでは、SQL Serverの
UNIQUE
制約の使用方法を学びました。