Summary: このチュートリアルでは、SQL Server の UNIQUE 制約を使用して、列や列のグループに含まれるデータの一意性を確保する方法を学びます。
Introduction to SQL Server UNIQUE constraint
SQL ServerのUNIQUE制約を使用すると、列や列のグループに格納されているデータが、テーブルの行の中で一意であることを保証することができます。
次のステートメントは、emailhr.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);
この構文では、UNIQUEUNIQUE制約を定義することもできます。
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はUNIQUEUNIQUE 制約に参加している列に格納されているデータの一意性を強制しています。 そのため、重複する行を挿入しようとすると、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となっており、あまり読みやすくありません。
UNIQUECONSTRAINT キーワードを使用します。
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 制約
UNIQUEPRIMARY KEYPRIMARY KEYを使用したほうがよいでしょう。UNIQUEPRIMARY KEYUNIQUE制約を使用してください。PRIMARY KEYUNIQUENULLUNIQUENULLNULLしか許可しません。次のステートメントは、
emailNULLである行を挿入します。Code language: SQL (Structured Query Language) (sql)INSERT INTO hr.persons(first_name, last_name)VALUES('John','Smith');ここで、
emailNULLを挿入しようとすると、エラーが発生します。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));以下の例では、
UNIQUEperson_idskill_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),);以下のステートメントは、
UNIQUEemail列に追加します。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
UNIQUEALTER 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制約の使用方法を学びました。