ユニークキー制約
カラムに対してユニークキー制約を設定する方法を確認します。書式は次の通りです。
CREATE TABLE db_name.tbl_name (col_name1 data_type1 UNIQUE, col_name2 data_type2, ...);
ユニークキー制約が設定されたカラムには重複する値は格納することができません。ただプライマリーキーとは異なりNULLは格納できます。またNULLの値だけは複数のカラムで重複して格納することができます。
カラムにユニークキー制約を設定するとそのカラムを対象としたユニークインデックスも同時に設定されます。
では実際に試してみます。次のようなテーブルを作成します。
mysql> create table uniquetest(id int unique, name varchar(10));
作成したテーブルのカラム情報を取得してみます。
プライマリーキー制約が設定されたカラムの「Key」列の値に「UNI」が設定されていることが分かります。
またインデックスについても確認してみます。次のように入力して下さい。
mysql> show index from uniquetest¥G
詳しいことはインデックスのページで確認しますが、「id」カラムを対象としたインデックスが1つあり、「Non_unique」が0なのでユニークインデックスであることを表しています。ただし「Null」はYESとなっておりNULLの格納は可能です。
ではデータを追加してみます。
続いてユニークキー制約が設定されているカラムに、既に存在している値と同じ値を持つデータを追加してみます。
このように重複した値は格納することができません。
ただし、NULLだけは例外でユニークキー制約が設定されているカラムに既にNULLが格納されているデータが存在していても、対象のカラムの値がNULLのデータを再度追加することができます。
複数のカラムを対象にユニークキー制約を設定
カラムに対してユニークキー制約を設定するには次の書式も使用することができます。
CREATE TABLE db_name.tbl_name (col_name1 data_type1, col_name2 data_type2, ..., UNIQUE(index_col_name1, index_col_name2, ...));
最初の書式ではカラム定義の時にUNIQUEを指定していましたが、今回の書式では後からユニークキー制約を付けるカラムを指定しています。どちらの書式を使った場合でも結果は同じです。
なおこの書式の場合には複数のカラムを対象にユニークキー制約を設定できます。この場合、複数のカラムの組み合わせが重複したデータは格納できません。
では実際に試してみます。次のようなテーブルを作成します。
mysql> create table uniquetest2( -> gakunen int, kumi varchar(10), name varchar(20), -> unique(gakunen, kumi));
作成したテーブルのカラム情報を取得してみます。
今回は複数のカラムを対象にユニークキー制約を設定していますが、最初のカラムの「Key」列の値に「MUL」が設定されていることが分かります。
またインデックスについても確認してみます。次のように入力して下さい。
mysql> show index from uniquetest2¥G
複数のカラムを対象にユニークインデックスが作成されていますので、「Key_name」に同じ値が設定されたデータが2つあります。(このデータの詳しい見方はインデックスのページで確認します)。
ではデータを追加してみます。
続いてユニークキー制約が設定されている複数のカラムの中で1つだけ既存の値と同じデータを追加してみます。
複数のカラムを対象にユニークキー制約を設定している場合、複数のカラムの値の組み合わせが既存のデータと完全に一致するデータは格納できませんが、いずれか一つのカラムの値が既存の値と同じである場合は格納できます。
ではユニークキー制約が設定されている複数のカラムの値の組み合わせが既存の値と一致するデータを追加してみます。
このようにエラーが発生してデータを追加することができませんでした。
なおユニークキー制約はプライマリーキー制約と異なり対象のカラムにNULLを格納することができます。
複数のカラムを対象にユニークキー制約を設定している場合は、対象となる全てのカラムの値がNULLの場合だけ重複したデータを格納することができます。
( Written by Tatsuo Ikura )