フィールド制約

フィールドに設定できる値に制限を設けます。

制約 説明
NOT NULL NULLを設定できなくする。
UNIQUE 同じ値を設定できなくする。
DEFAULT 値が設定されないときに、指定した値を初期値とする。
PRIMARY KEY 主キーとする。

INTEGER PRIMARY KEY

「INTEGER PRIMARY KEY」と指定されたフィールドは、明示的に値を設定しないときは自動で連番が割り当てられます。

C:\>sqlite sample.sqlite
SQLite version 2.8.17
Enter ".help" for instructions

sqlite> create table user(id integer primary key,name);
sqlite> insert into user(name) values('a');
sqlite> insert into user(name) values('b');

sqlite> .mode column
sqlite> select * from user;
1           a 自動で1から連番が割り当てられている
2           b

sqlite> insert into user values(10,'c');
sqlite> select * from user;
1           a
2           b
10          c 明示的に値を指定したときには、その値が設定される

sqlite> insert into user(name) values('d');
sqlite> select * from user;
1           a
2           b
10          c
11          d 末尾のデータに続くように、連番が割り当てられている

AUTOINCREMENT

自動で割り当てられている番号は、末尾のデータに続くように決定されます。よって末尾のデータを削除した後に新たなデータを追加すると、削除したデータの番号が再利用されます。これを防ぐには、「INTEGER PRIMARY KEY AUTOINCREMENT」とします。ただしこの機能は、SQLite 3.1.0以降でなければ使用できません。

C:\>sqlite3 sample.sqlite3
SQLite version 3.7.15.2 2013-01-09 11:53:05
Enter ".help" for instructions
Enter SQL statements terminated with a ";"

sqlite> create table user(id integer primary key,name);
sqlite> insert into user(name) values('a');
sqlite> insert into user(name) values('b');
sqlite> insert into user(name) values('c');

sqlite> .mode column
sqlite> select * from user;
1           a
2           b
3           c

sqlite> delete from user where id=2; 途中のデータを削除
sqlite> select * from user;
1           a
3           c

sqlite> insert into user(name) values('d');
sqlite> select * from user;
1           a
3           c
4           d 末尾のデータに連続するように、番号が割り当てられている

sqlite> delete from user where id=4; 末尾のデータを削除
sqlite> select * from user;
1           a
3           c

sqlite> insert into user(name) values('e');
sqlite> select * from user;
1           a
3           c
4           e 削除したデータの番号が再利用されている
sqlite> create table user2(id integer primary key autoincrement,name);
sqlite> insert into user2(name) values('a');
sqlite> insert into user2(name) values('b');
sqlite> insert into user2(name) values('c');
sqlite> select * from user2;
1           a
2           b
3           c

sqlite> delete from user2 where id=3; 末尾のデータを削除
sqlite> select * from user2;
1           a
2           b

sqlite> insert into user2(name) values('d');
sqlite> select * from user2;
1           a
2           b
4           d 削除したデータの番号は使われていない

割り当てられる最大値

自動で割り当てられる番号 (オートナンバー) の最大値は、

  • SQLite2 … 2³¹-1 (9,223,372,036,854,775,807)
  • SQLite3 … 2⁶³-1 (2,147,483,647)

です。

違反したときの処理 (ON CONFLICT)

フィールドの制約に違反した場合の処理は、ON CONFLICTコマンドで設定します。

ON CONFLICTの設定値
パラメータ 処理 戻り値
ROLLBACK トランザクションがロールバックされる SQLITE_CONSTRAINT
ABORT コマンドが中断される
FAIL コマンドが失敗とされる
IGNORE コマンドは実行されず、処理は継続される なし
REPLACE 元のデータを上書きする

たとえばUNIQUE制約に違反したときにREPLACEで元のデータを上書きするには、次にように指定します。

CREATE TABLE table ( field1 UNIQUE ON CONFLICT REPLACE, field2 );