Rodhos Soft

備忘録を兼ねた技術的なメモです。Rofhos SoftではiOSアプリ開発を中心としてAndroid, Webサービス等の開発を承っております。まずはご相談下さい。

制約

PRIMARY KEY プライマリキー

  1. 複数カラムに設定できる。
  2. 重複した値を設定できなくなる(複数カラムに設定している場合は組み合わせた値が重複しない)。
  3. nullは入る
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);