読者です 読者をやめる 読者になる 読者になる

SQLiteの自動インクリメント

<環境>
CentOS 6.5/64bit
sqlite 3.6.20


SQLiteで自動インクリメントするには、integerにPRIMARY KEYを指定すれば良い。

$ sqlite3 test.db
SQLite version 3.6.20
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> CREATE TABLE sample (id integer PRIMARY KEY, name text NOT NULL);
sqlite> INSERT INTO sample (name) VALUES ('user1');
sqlite> INSERT INTO sample (name) VALUES ('user2');
sqlite> INSERT INTO sample (name) VALUES ('user3');
sqlite> SELECT * FROM sample;
1|user1
2|user2
3|user3

但し、上記の方法の場合は、PRIMARY KEYを指定した列の現在の最大値に1を加えた数値を自動的に付加する。
従って、削除されたレコードが再利用される可能性がある。

sqlite> DELETE FROM sample WHERE id=3;
sqlite> SELECT * FROM sample;
1|user1
2|user2
sqlite> INSERT INTO sample (name) VALUES ('user4');
sqlite> SELECT * FROM sample;
1|user1
2|user2
3|user4

4つ目のデータでも、id=3が削除されたため、再利用された。

再利用されないようにするためには、AUTOINCREMENT を付けてテーブルを定義する。

sqlite> CREATE TABLE sample2 (id integer PRIMARY KEY AUTOINCREMENT, name 
sqlite> text NOT NULL);
sqlite> INSERT INTO sample2 (name) VALUES ('user1');
sqlite> INSERT INTO sample2 (name) VALUES ('user2');
sqlite> INSERT INTO sample2 (name) VALUES ('user3');
sqlite> SELECT * FROM sample2;
1|user1
2|user2
3|user3

idが再利用されないことを確認する。

sqlite> DELETE FROM sample2 WHERE id=3;
sqlite> SELECT * FROM sample2;
1|user1
2|user2
sqlite> INSERT INTO sample2 (name) VALUES ('user4');
sqlite> SELECT * FROM sample2;
1|user1
2|user2
4|user4


参考;
http://www.sqlite.org/faq.html#q1
http://www.sqlite.org/autoinc.html