制約
PRIMARY KEY プライマリキー
sqlite> create table person3(id integer primary key, name text);
sqlite> insert into person3 values(3,'hoge'); sqlite> insert into person3 values(3,'fuga'); Error: UNIQUE constraint failed: person3.id
INTEGER型にプライマリキーを設定して、データ追加時にそれを省略すると勝手に数値が連番で追加される。
sqlite> .schema CREATE TABLE person3(id integer primary key, name text); sqlite> insert into person3(name) values('foo'); sqlite> select * from person3; 3 hoge 4 foo
追加される値はカラムの値の中で最大のものに+1がされたものになる。
自動的に振られているID(RAWID)がある。
sqlite> select * from person3; 3 hoge 4 foo sqlite> select *, rowid from person3; 3 hoge 3 4 foo 4
つまり、integer primary keyと同じ動き
AUTOINCREMENT 連番
integer primary keyと違い、削除されたカラムもふくめて最大のものに+1されたものが振られる。
削除されたカラムもふくめて最大の数を取得する
sqlite> create table person4(id integer primary key autoincrement, name) sqlite> insert into person4(name) values('oop'); sqlite> insert into person4(name) values('fuga'); sqlite> insert into person4(name) values('kyo'); sqlite> delete into person4 where name = 'kyo'; sqlite> insert into person4(name) values('hoge'); sqlite> select * from person4; 1 oop 2 fuga 4 hoge
sqlite_sequenceというテーブルから取得できる。
sqlite> .schema sqlite_sequence CREATE TABLE sqlite_sequence(name,seq);
sqlite> select * from sqlite_sequence where name = 'person4'; 4
NOT NULL制約
sqlite> create table person5(name text); sqlite> create table person6(name text not null);
sqlite> insert into person5 values(null); sqlite> insert into person6 values(null); Error: NOT NULL constraint failed: person6.name
UNIQUE制約 同じ値が格納できない
sqlite> create table person7(name unique); sqlite> insert into person7 values("puga"); sqlite> insert into person7 values("puga"); Error: UNIQUE constraint failed: person7.name
DEFAULT制約 省略された際に入れる値を決める
sqlite> create table person8(name text, age integer default 20); sqlite> insert into person8(name) values('pyoi') sqlite> select * from person8 pyoi 20
制約いれずに省略すると通常はnullが入る。
デフォルトに日付を入れる。CURRENT_TIME, CURRENT_DATE, CURRENT_TIMESTAMP
sqlite> create table person9(name text, day default current_timestamp); sqlite> insert into person9(name) values('fuga'); sqlite> select * from person9; fuga 2015-10-05 03:29:20
形式については以下を参照www.dbonline.jp
CHECK制約 条件式をチェックする。
sqlite> create table person10(age integer check(age>0 and age<10)) sqlite> insert into person10 values(2); sqlite> insert into person10 values(0); Error: CHECK constraint failed: person10 sqlite> insert into person10 values(14); Error: CHECK constraint failed: person10
sqlite> create table person11(x integer, y integer check (x - y > 0)); sqlite> insert into person11 values(1,0); sqlite> insert into person11 values(0,0); Error: CHECK constraint failed: person11 sqlite> insert into person11 values(7,4);