UNIQUE制約の使い方

カラムに格納する値として既に格納されているデータの値と重複した値を禁止したい場合、カラムに UNIQUE 制約を設定します。ここでは SQLite における UNIQUE 制約の使い方について解説します。

(Last modified: )

UNIQUE制約とは

カラムに UNIQUE 制約を設定すると、対象のカラムには重複した値を設定することができなくなります。UNIQUE 制約をカラムに設定する場合の書式は次の通りです。

CREATE TABLE テーブル名(カラム名 UNIQUE, ...);

では実際に試してみます。次のようなテーブルを作成しました。 id カラムには UNIQUE 制約が設定されています。

create table user(id integer unique, name text);

UNIQUE制約とは(1)

それではデータを追加してみます。

insert into user values(1, 'Honda');
insert into user values(2, 'Moriyama');
insert into user values(4, 'Kudou');

UNIQUE制約とは(2)

次に UNIQUE制約が設定されている id カラムの値として、既に追加済みのデータと同じ値を設定したデータを追加してみます。

insert into user values(2, 'Suzuki');

UNIQUE制約とは(3)

この場合 Runtime error: UNIQUE constraint failed: user.id というエラーが表示されます。

このように UNIQUE 制約をカラムに設定することで、重複の無い値しかカラムに格納できなくなります。

なお UNIQUE 制約が設定されていても NULL は重複して格納することが可能です。

insert into user values(null, 'Okuda');
insert into user values(null, 'Katayama');

UNIQUE制約とは(4)

カラムに NULL を格納することを許可したくない場合は「NOT NULL制約の使い方」を合わせて設定されて下さい。

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

UNIQUE 制約を単独のカラムだけではなく複数のカラムの組み合わせに UNIQUE 制約を設定することも可能です。次の書式を使用します。

CREATE TABLE テーブル名(カラム名1, カラム名2, ... ,
  UNIQUE(カラム名1, カラム名2, ...));

2 つのカラムを対象に UNIQUE 制約を設定すると、それぞれのカラムの値は重複しても構いませんが 2 つのカラムの値の組み合わせと同じ組み合わせの値を格納しようとするとエラーとなります。

※ 例えば A と B の組み合わせに UNIQUE 制約を設定した場合、 A=1,B=5 というデータが追加されている状態で A=1,B=3 や A=4,B=5 のようにどちらかのカラムの値だけが同じデータは追加できますが、 A=1,B=5 のように A と B のペアの値が既存のデータと同じ場合は追加できません。

では実際に試してみます。次のようなテーブルを作成しました。 no カラムと unit カラムのペアに対して UNIQUE 制約が設定されています。

create table staff(no integer, unit text, name text, unique(no, unit));

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

まずいくつかのデータを追加してみます。

insert into staff values(1, 'Sales', 'Takahashi');
insert into staff values(4, 'Dev', 'Suzuki');
insert into staff values(2, 'Office', 'Endou');

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

次に no カラムの値だけ既存のデータと同じデータや、 unit カラムの値だけ既存のデータと同じデータを追加してみます。今回は単独のカラムの値が既存のデータと同じでもエラーとはなりません。

insert into staff values(4, 'Design', 'Fukuda');
insert into staff values(7, 'Sales', 'Noda');

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

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

insert into staff values(2, 'Office', 'Mori');

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

この場合は UNIQUE 制約が設定されているため Runtime error: UNIQUE constraint failed: staff.no, staff.unit というエラーが表示されます。

このように単独のカラムに対してだけではなく、複数のカラムの組み合わせに対しても UNIQUE 制約を設定することが可能です。

-- --

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

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。