SQLite | テーブル | CHECK制約

CHECK制約を使うと、カラムに保存する値が条件を満たすか検証できます。ここでは、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));
sqlite> create table user (id integer, name text, old integer check (old> 18));
sqlite> 

oldの値が条件を満たす行は問題なく追加できます。

insert into user values (1, 'devkuma', 19);
insert into user values (4, 'kimkc', 21);
qlite> insert into user values (1, 'devkuma', 19);
sqlite> insert into user values (4, 'kimkc', 21);
sqlite> 
sqlite> select * from user;
id          name        old       
----------  ----------  ----------
1           devkuma     19        
4           kimkc       21        
sqlite> 

条件を満たさないoldの値を追加すると、Error: CHECK constraint failed: userと表示されます。

insert into user values (7, 'araikuma', 16);
sqlite> insert into user values (7, 'araikuma', 16);
Error: CHECK constraint failed: user
sqlite> 

このようにCHECK制約でカラムに保存できる値を制限できます。

ANDとORで複雑な条件を定義する

ANDORを使うと、より複雑な条件式を記述できます。次の例ではoldを18より大きく30未満の値に制限します。

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

次の例ではgendermanまたはwomanに制限します。

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

複数のカラムを使う条件にはテーブル単位の制約を使用します。この例では、genderwomanまたはoldが20より大きい行を追加できます。

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

最後の例のテーブルを実際に作成します。

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

データを追加します。性別がwoman、または年齢が20より大きい行は正常に追加されます。

insert into user values ( 'dekuma', 16, 'woman');
insert into user values ( 'kimkc', 31, 'man');
insert into user values ( 'araikuma', 24, 'woman');
sqlite> insert into user values ( 'dekuma', 16, 'woman');
sqlite> insert into user values ( 'kimkc', 31, 'man');
sqlite> insert into user values ( 'araikuma', 24, 'woman');
sqlite> 

CHECK条件を満たさない行を追加すると、Error: CHECK constraint failed: userと表示されます。

insert into user values ('happykuma', 15, 'man');
sqlite> insert into user values ('happykuma', 15, 'man');
Error: CHECK constraint failed: user
sqlite>

このようにANDORを組み合わせて複雑なCHECK制約を定義できます。