フィールドに設定できる値に制限を設けます。
| 制約 | 説明 |
|---|---|
| NOT NULL | NULLを設定できなくする。 |
| UNIQUE | 同じ値を設定できなくする。 |
| DEFAULT | 値が設定されないときに、指定した値を初期値とする。 |
| 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 末尾のデータに続くように、連番が割り当てられている
自動で割り当てられている番号は、末尾のデータに続くように決定されます。よって末尾のデータを削除した後に新たなデータを追加すると、削除したデータの番号が再利用されます。これを防ぐには、「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 削除したデータの番号は使われていない
自動で割り当てられる番号 (オートナンバー) の最大値は、
です。
フィールドの制約に違反した場合の処理は、ON CONFLICTコマンドで設定します。
| パラメータ | 処理 | 戻り値 |
|---|---|---|
| ROLLBACK | トランザクションがロールバックされる | SQLITE_CONSTRAINT |
| ABORT | コマンドが中断される | |
| FAIL | コマンドが失敗とされる | |
| IGNORE | コマンドは実行されず、処理は継続される | なし |
| REPLACE | 元のデータを上書きする |
たとえばUNIQUE制約に違反したときにREPLACEで元のデータを上書きするには、次にように指定します。
CREATE TABLE table ( field1 UNIQUE ON CONFLICT REPLACE, field2 );