<環境>
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