SQLのCREATE TABLEでテーブルの列の値を一意にする(UNIQUE)制約を設定する

SQLのCREATE TABLE文では、データベースにデータを格納するためのテーブルを作成することができます。

テーブルには主キー(プライマリキー: PRIMARY KEY)が設定できることは、以前に別の記事でご紹介しました。

SQLのCREATE TABLEでテーブルに主キー(PRIMARY KEY)制約を設定する
SQLのCREATE TABLE文を使うことで、データベースにテーブルを作成することができます。 基本的なテーブルの作成 ...

テーブルに主キーを設定することで、テーブルに格納されている1つのレコードを特定することができるようになります。

上記の例では、「列1」に主キー(PRIMARY KEY)が設定されていますので、列1に格納されている値をもとに、目的のレコードを特定することができます。

主キーはレコードを特定するためのものなので、主キーには重複する値が格納されません。

重複する値が登録できない列が主キー列だけであれば、テーブルに主キーを設定しておけば問題ないのですが、主キーとは別の列に格納される値も重複させたくない場合があります。

データベースには、この重複しない値を格納する列を定義するために、特定の列の値を一意(ユニーク)に設定するための制約が用意されています。

今回は、その列の値を重複させなくするためのUNIQUE制約について紹介したいと思います。

尚、本記事ではテーブル作成の基本についての解説は省略しますので、テーブルの基本的な作成方法について知りたい方は、以下の記事で解説していますので、参考にしてください。

データベースのテーブルを作成するSQL CREATE TABLE
SQL文では、既存のテーブルに対してINSERT、UPDATE、DELETEなどのステートメントを使用して、テーブルやビューのデータ(レコー...

UNIQUE制約を設定するテーブル

本記事では、UNIQUE制約を設定するテーブルとして、次のテーブルを使用します。

従業員テーブル

従業員テーブルに作成する列の定義は、次ようにします。

テーブルの列定義

列名 データ型 主キー
従業員ID int
varchar(20)
varchar(20)
表示名 varchar(50)
入社日 date

テーブルのCREATE TABLE文

UNIQUE(ユニーク)制約の指定

列の値が重複しないように一意(ユニーク)な値が設定されるようにするには、UNIQUE制約を使用します。

UNIQUE制約は、列を定義する部分のデータ型を記述した後に、スペース文字列を入力した後に記述します。

従業員テーブルの主キーはなので従業員IDは重複しませんが、ここでは主キーの他に「表示名」の列に一意な値が格納されるとします。

表示名にUNIQUE制約を設定する場合のCREATE TABLE文は以下のようになります。

UNIQUE制約を定義した列には、同じ値を登録することはできなくなります。

UNIQUE制約キー列重複エラー

UNIQUE制約は、列に重複する値を格納できなくする設定ですが、NULLは格納されます。

UNIQUE制約キー列NULL登録

データベース製品によっては、NULLを複数のレコードに設定できてしまう場合があります。

UNIQUE制約キー列NULL重複

NULLはNULLと一致しないと判定されるため、一意とみなされるからです。

UNIQUE制約を定義した列にNULLを格納できないようにするには、UNIQUE制約と同時にNOT NULL制約を定義する必要があります。

従業員テーブルの表示名列にUNIQUE制約とNOT NULL制約を指定すると、次のようになります。

UNIQUEの定義と、NOT NULLの定義の順番は、どちらが先でも構いません。

UNIQUE制約を定義する列には、特に理由がない限り、NOT NULL制約も同時に定義しておく方がよいでしょう。