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で複雑な条件を定義する
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'));
複数のカラムを使う条件にはテーブル単位の制約を使用します。この例では、genderがwomanまたは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>
このようにANDやORを組み合わせて複雑なCHECK制約を定義できます。