UNIQUE制約(ユニーク制約を設定する)

カラムに UNIQUE 制約を設定すると、カラムには重複した値を格納することができなくなります。 PRIMARY KEY と似ていますが UNIQUE 制約を設定したカラムには NULL を格納することができます。ここでは MariaDB における UNIQUE 制約の使い方について解説します。

(Last modified: )

UNIQUE制約の使い方

テーブルを作成するときにカラムに対して UNIQUE 制約を設定するには次の書式を使用します。

CREATE TABLE db_name.tbl_name
  (col_name data_type UNIQUE,...)

カラムのデータ型のあとに UNIQUE を記述します。 UNIQUE 制約はテーブルに含まれる複数のカラムに対して設定することができます。

UNIQUE 制約が設定されたカラムには重複した値を格納できなくなります。この点は PRIMARY KEY 制約と似ていますが、 UNIQUE 制約の場合は値として NULL を格納することができ、また NULL だけは複数のデータで重複して格納できます。

では実際に試してみます。次のように実行してください。

create table user(id varchar(10) unique, name varchar(10));

UNIQUE制約の使い方(1)

新しいテーブルを作成しました。テーブルの中の id カラムには UNIQUE 制約が設定されています。

作成したテーブルのカラム情報を取得してみます。

show columns from user;

UNIQUE制約の使い方(2)

UNIQUE 制約が設定された id カラムには自動でインデックスが作成されており、Key カラムの値に UNI と設定されています。 PRIMARY KEY 制約とは異なり、 UNIQUE 制約を設定しても NOT NULL 制約は設定されないので NULL を格納できます。

作成されたインデックスについて SHOW INDEX文を使って確認してみます。

show index from user\G

UNIQUE制約の使い方(3)

作成されたインデックスの名前は id で、 Non_unique が 0 となっているため、 id カラムには重複した値を格納することができません。

それでは作成したテーブルにデータを追加してみます。次のように実行して 2 つのデータを追加してください。

insert into user values('AM3', 'Tanaka');
insert into user values('J4P', 'Endou');

UNIQUE制約の使い方(4)

問題なく追加することができました。

次に id カラムの値が既存のデータの値と同じデータを追加してみます。

insert into user values('J4P', 'Honda');

UNIQUE制約の使い方(5)

「Duplicate entry 'J4P' for key 'id'」というエラーが発生してデータの追加に失敗しました。 UNIQUE 制約が設定されているカラムには重複した値を格納することはできません。

最後に id カラムの値として NULL のデータを複数追加してみます。

insert into user values(NULL, 'Kudou');
insert into user values(NULL, 'Nishi');

UNIQUE制約の使い方(6)

UNIQUE 制約が設定されているカラムに対して NULL を格納することができました。また NULL については複数のデータで重複していても格納することができます。

複数のカラムの組み合わせに対してUNIQUE制約を設定する

UNIQUE 制約はテーブルに含まれる複数のカラムに設定できますが、対象となるカラムは 1 つだけではなく 複数のカラムの組み合わせに対して設定することもできます。例えば 2 つのカラムの組み合わせに対して設定した場合、 2 つのカラムに格納されている値の組み合わせが他のデータと重複することはできなくなります。

複数のカラムを対象とした UNIQUE 制約を設定するには次の書式を使用します。

CREATE TABLE db_name.tbl_name
  (col_name1 data_type1 , col_name2 data_type2 , ..., 
   UNIQUE(col_name1, col_name2, ...))

では実際に試してみます。次のように実行してください。

create table product (id int, color varchar(5), shape varchar(10), unique (color, shape));

複数のカラムの組み合わせに対してUNIQUE制約を設定する(1)

新しいテーブルを作成しました。テーブルの中の color カラムと shape カラムの組み合わせに対して UNIQUE 制約が設定されています。

作成したテーブルのカラム情報を取得してみます。

show columns from product;

複数のカラムの組み合わせに対してUNIQUE制約を設定する(2)

UNIQUE 制約が設定された color カラムと shape カラムには自動でインデックスが作成されており、 Key カラムの値をみていただくと MUL が設定されています。今回は複数のカラムの組み合わせに対して UNIQUE 制約を設定していますが、最初のカラムに MUL が設定されるようです。

作成されたインデックスについて SHOW INDEX文を使って確認してみます。

show index from product\G

複数のカラムの組み合わせに対してUNIQUE制約を設定する(3)

複数のカラムの組み合わせに対してUNIQUE制約を設定する(4)

インデックスは 2 つ作成されていますが、どちらもインデックスの名前は対象となっているカラムの名前となっています。

それでは作成したテーブルにデータを追加してみます。次のように実行して 2 つのデータを追加してください。

insert into product values(1, 'Red', 'Rectangle');
insert into product values(2, 'Blue', 'Triangle');

複数のカラムの組み合わせに対してUNIQUE制約を設定する(5)

問題なく追加することができました。

次に color カラムの値が既存のデータの値と同じですが shape カラムの値が異なるデータを追加してみます。

insert into product values(3, 'Red', 'Circle');

複数のカラムの組み合わせに対してUNIQUE制約を設定する(6)

今回のデータも問題なく追加することができました。今回は color カラムの shape カラムの 2 つのカラムを対象に UNIQUE 制約が設定されているので、この 2 つのカラムに格納する値の組み合わせと同じデータが対象のテーブルに格納済みの場合はエラーとなりますが、どちらか一つのカラムの値が同じだけであれば問題なく格納することができます。

次に color カラムと shape カラムの値の組み合わせが既存のデータの値と同じデータを追加してみます。

insert into product values(2, 'Blue', 'Triangle');

複数のカラムの組み合わせに対してUNIQUE制約を設定する(7)

「Duplicate entry 'Blue-Triangle' for key 'color'」というエラーが発生してデータの追加に失敗しました。今回は UNIQUE 制約が設定されている 2 つのカラムの値の組み合わせが既にテーブルに存在していたのでエラーとなりました。

-- --

MariaDB における UNIQUE 制約の使い方について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。