SQL Server UNIQUE Constraint (日本語)

Summary: このチュートリアルでは、SQL Server の UNIQUE 制約を使用して、列や列のグループに含まれるデータの一意性を確保する方法を学びます。

Introduction to SQL Server UNIQUE constraint

SQL ServerのUNIQUE制約を使用すると、列や列のグループに格納されているデータが、テーブルの行の中で一意であることを保証することができます。

次のステートメントは、emailhr.personsテーブルの行の間で一意であるテーブルを作成します。

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);
Code language: SQL (Structured Query Language) (sql)

この構文では、UNIQUEUNIQUE制約を定義することもできます。

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));
Code language: SQL (Structured Query Language) (sql)

裏では、SQL ServerはUNIQUEUNIQUE 制約に参加している列に格納されているデータの一意性を強制しています。 そのため、重複する行を挿入しようとすると、SQL Serverはその変更を拒否し、UNIQUE制約に違反しているというエラーメッセージを返します。

次のステートメントは、hr.persons テーブルに新しい行を挿入します:

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]');
Code language: SQL (Structured Query Language) (sql)

SQL Server は次のエラーメッセージを発行しました:

Violation of UNIQUE KEY constraint 'UQ__persons__AB6E616417240E4E'. Cannot insert duplicate key in object 'hr.persons'. The duplicate key value is ([email protected]).
Code language: Shell Session (shell)

UNIQUE 制約に個別の名前を指定しない場合、SQL Server は自動的にその名前を生成します。 この例では、制約名はUQ__persons__AB6E616417240E4Eとなっており、あまり読みやすくありません。

UNIQUECONSTRAINT キーワードを使用します。

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));
Code language: SQL (Structured Query Language) (sql)

UNIQUE 制約に特定の名前を割り当てることで、次のようなメリットがあります。

  • エラーメッセージを分類しやすくなります。
  • 制約を変更したいときに、その制約名を参照することができます。 PRIMARY KEY 制約

    UNIQUEPRIMARY KEYPRIMARY KEY を使用したほうがよいでしょう。

    UNIQUEPRIMARY KEYUNIQUE 制約を使用してください。

    PRIMARY KEYUNIQUENULLUNIQUENULLNULLしか許可しません。

    次のステートメントは、emailNULLである行を挿入します。

    INSERT INTO hr.persons(first_name, last_name)VALUES('John','Smith');
    Code language: SQL (Structured Query Language) (sql)

    ここで、emailNULLを挿入しようとすると、エラーが発生します。

    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>).
    Code language: SQL (Structured Query Language) (sql)

    列のグループに対する UNIQUE 制約

    列のグループに対する UNIQUE 制約を定義するには、次のように列名をカンマで区切ってテーブル制約として記述します。

    CREATE TABLE table_name ( key_column data_type PRIMARY KEY, column1 data_type, column2 data_type, column3 data_type, ..., UNIQUE (column1,column2));
    Code language: SQL (Structured Query Language) (sql)

    以下の例では、UNIQUEperson_idskill_id から構成されます。

    CREATE TABLE hr.person_skills ( id INT IDENTITY PRIMARY KEY, person_id int, skill_id int, updated_at DATETIME, UNIQUE (person_id, skill_id));
    Code language: SQL (Structured Query Language) (sql)

    既存の列に UNIQUE 制約を追加する

    テーブル内の既存の列や列のグループに UNIQUE 制約を追加すると、SQL Server はまずこれらの列の既存のデータを調べ、すべての値が一意であることを確認します。 もしSQL Serverが重複した値を見つけた場合は、エラーを返し、UNIQUE制約を追加しません。

    以下は、テーブルに UNIQUE 制約を追加する構文を示しています。

    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),);
    Code language: SQL (Structured Query Language) (sql)

    以下のステートメントは、UNIQUEemail 列に追加します。

    ALTER TABLE hr.personsADD CONSTRAINT unique_email UNIQUE(email);
    Code language: SQL (Structured Query Language) (sql)

    同様に、次のステートメントは、UNIQUE 制約を電話番号の列に追加します。

    ALTER TABLE hr.personsADD CONSTRAINT unique_phone UNIQUE(phone);
    Code language: SQL (Structured Query Language) (sql)

    Delete UNIQUE constraints

    UNIQUEALTER TABLE DROP CONSTRAINT ステートメントを使用します。

    ALTER TABLE table_nameDROP CONSTRAINT constraint_name;
    Code language: SQL (Structured Query Language) (sql)

    以下のステートメントは、hr.personテーブルからunique_phone制約を削除します。person table:

    ALTER TABLE hr.personsDROP CONSTRAINT unique_phone;
    Code language: SQL (Structured Query Language) (sql)

    UNIQUE制約の修正

    SQL Serverには、UNIQUE制約を修正するための直接的なステートメントはありませんので、制約を変更したい場合には、まず制約を削除し、再作成する必要があります。

    このチュートリアルでは、SQL ServerのUNIQUE制約を使用して、列または列のグループに含まれるデータが一意であることを確認する方法を学びました

    このチュートリアルでは、SQL ServerのUNIQUE制約の使用方法を学びました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です