CHECK制約の使い方

カラムに格納する値に条件に一致しているかどうかの判定を行いたい場合、カラムに CHECK 制約を設定します。ここでは SQLite における CHECK 制約の使い方について解説します。

(Last modified: )

CHECK制約とは

カラムに CHECK 制約を設定すると、データを追加する時に値が指定した条件を満たしているかどうかのチェックをすることができます。 CHECK 制約をカラムに設定する場合の書式は次の通りです。

CREATE TABLE テーブル名(カラム名 CHECK(条件式), ...);

条件式にはカラムに格納する値の条件を記述します。例えば格納できる値をは 0 以上の値に制限する、といった条件式を指定できます。

また複数のカラムを組み合わせた条件式を設定したい場合の書式として次のような書式も利用できます。(詳しくは後で解説します)。

CREATE TABLE テーブル名(カラム名1, カラム名2, ... , CHECK(条件式));

では実際に試してみます。次のようなテーブルを作成しました。 old カラムには CHECK 制約が設定されており、 18 より大きな数値しか格納できません。

create table user(id integer, name text, old integer check(old > 18));

CHECK制約とは(1)

old カラムの値が条件に一致する場合は問題なくデータを追加できます。

insert into user values(1, 'Suzuki', 19);
insert into user values(4, 'Kudou', 21);

CHECK制約とは(2)

次に old カラムが条件に一致しないデータを追加してみます。

insert into user values(7, 'Takahashi', 16);

CHECK制約とは(3)

この場合 Runtime error: CHECK constraint failed: old > 18 というエラーが表示されます。

このように CHECK 制約を使用することでカラムに格納できる値を制限することが可能です。

AND/ORを使ったより複雑な条件式を設定する

CHECK 制約で記述する条件式では AND や OR を使用してより複雑な条件式を記述することができます。例えば old カラムの値を 18 より大きく 30 未満に制限する場合は次のように記述できます。

create table user(id integer, name text,
  old integer check(old > 18 and old < 30));

また別の例として gender カラムの値を man か woman に限定する場合は次のように記述できます。

create table user(id integer, name text,
  gender text check(gender = 'man' or gender = 'woman'));

また複数のカラムを使った条件式を記述する場合は、2番目の書式を使って次のように記述することができます。下記では性別が女性か、または年齢が 20 より大きい場合にデータを追加できます。

create table user(name text, old integer, gender text,   check(gender = 'woman' or old > 20));

では実際に試してみます。最後に記載したテーブルを実際に作成しました。

AND/ORを使ったより複雑な条件式を設定する(1)

データを追加してみます。性別が女性か年齢が20より大きい場合は正常に追加できます。

insert into user values('Takahashi', 16, 'woman');
insert into user values('Itou', 31, 'man');
insert into user values('Suzuki', 24, 'woman');

AND/ORを使ったより複雑な条件式を設定する(2)

次に CHECK 制約の条件式に合わないデータを追加してみます。

insert into user values('Yamada', 15, 'man');

AND/ORを使ったより複雑な条件式を設定する(3)

今回は Runtime error: CHECK constraint failed: gender = 'woman' or old > 20 というエラーが表示されます。

このように AND や OR を使用することで、より複雑な条件式を CHECK 制約で設定することが可能になります。

-- --

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

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

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