SQLのCREATE TABLE文では、データベースにデータを格納するためのテーブルを作成することができます。
1 2 3 4 5 6 |
CREATE TABLE テーブル ( 列1 int, 列3 date, 列2 varchar(10), ); |
テーブルには主キー(プライマリキー: PRIMARY KEY)が設定できることは、以前に別の記事でご紹介しました。
1 2 3 4 5 6 |
CREATE TABLE テーブル ( 列1 int PRIMARY KEY, 列2 date, 列3 varchar(10), ); |
テーブルに主キーを設定することで、テーブルに格納されている1つのレコードを特定することができるようになります。
上記の例では、「列1」に主キー(PRIMARY KEY)が設定されていますので、列1に格納されている値をもとに、目的のレコードを特定することができます。
主キーはレコードを特定するためのものなので、主キーには重複する値が格納されません。
重複する値が登録できない列が主キー列だけであれば、テーブルに主キーを設定しておけば問題ないのですが、主キーとは別の列に格納される値も重複させたくない場合があります。
データベースには、この重複しない値を格納する列を定義するために、特定の列の値を一意(ユニーク)に設定するための制約が用意されています。
今回は、その列の値を重複させなくするためのUNIQUE制約について紹介したいと思います。
尚、本記事ではテーブル作成の基本についての解説は省略しますので、テーブルの基本的な作成方法について知りたい方は、以下の記事で解説していますので、参考にしてください。
UNIQUE制約を設定するテーブル
本記事では、UNIQUE制約を設定するテーブルとして、次のテーブルを使用します。
従業員テーブル
従業員テーブルに作成する列の定義は、次ようにします。
テーブルの列定義
列名 | データ型 | 主キー |
---|---|---|
従業員ID | int | ○ |
姓 | varchar(20) | |
名 | varchar(20) | |
表示名 | varchar(50) | |
入社日 | date |
テーブルのCREATE TABLE文
1 2 3 4 5 6 7 8 |
CREATE TABLE 従業員 ( 従業員ID int PRIMARY KEY, 姓 varchar(20), 名 varchar(20), 表示名 varchar(50), 入社日 date, ); |
UNIQUE(ユニーク)制約の指定
列の値が重複しないように一意(ユニーク)な値が設定されるようにするには、UNIQUE制約を使用します。
UNIQUE制約は、列を定義する部分のデータ型を記述した後に、スペース文字列を入力した後に記述します。
1 |
列の名前 列のデータ型 UNIQUE |
従業員テーブルの主キーはなので従業員IDは重複しませんが、ここでは主キーの他に「表示名」の列に一意な値が格納されるとします。
表示名にUNIQUE制約を設定する場合のCREATE TABLE文は以下のようになります。
1 2 3 4 5 6 7 8 |
CREATE TABLE 従業員 ( 従業員ID int PRIMARY KEY, 姓 varchar(20), 名 varchar(20), 表示名 varchar(50) UNIQUE, 入社日 date, ); |
UNIQUE制約を定義した列には、同じ値を登録することはできなくなります。
UNIQUE制約は、列に重複する値を格納できなくする設定ですが、NULLは格納されます。
データベース製品によっては、NULLを複数のレコードに設定できてしまう場合があります。
NULLはNULLと一致しないと判定されるため、一意とみなされるからです。
UNIQUE制約を定義した列にNULLを格納できないようにするには、UNIQUE制約と同時にNOT NULL制約を定義する必要があります。
従業員テーブルの表示名列にUNIQUE制約とNOT NULL制約を指定すると、次のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
CREATE TABLE 従業員 ( 従業員ID int PRIMARY KEY, 姓 varchar(20), 名 varchar(20), 表示名 varchar(50) UNIQUE NOT NULL, 入社日 date, ); -- または CREATE TABLE 従業員 ( 従業員ID int PRIMARY KEY, 姓 varchar(20), 名 varchar(20), 表示名 varchar(50) NOT NULL UNIQUE, 入社日 date, ); |
UNIQUEの定義と、NOT NULLの定義の順番は、どちらが先でも構いません。
UNIQUE制約を定義する列には、特に理由がない限り、NOT NULL制約も同時に定義しておく方がよいでしょう。