SQLite で auto-increment なフィールドを作成する方法
PHP のマニュアルの sqlite_last_insert_rowid の項目を見ていたら
Tip: You can create auto-increment fields in SQLite by declaring them as INTEGER PRIMARY KEY in your table schema.
つまり,SQLite で auto-increment なフィールドを作りたければ,
INTEGER PRIMARY KEY
を指定してあげればいいらしい.
このような記述を見つけたのでテストしてみた.
- SQLite 2.x の場合
$ sqlite test.db
SQLite version 2.8.16
Enter ".help" for instructions
sqlite> CREATE TABLE a (a INTEGER PRIMARY KEY, b TEXT);
sqlite> INSERT INTO a VALUES (NULL, 'test');
sqlite> INSERT INTO a VALUES (NULL, 'test2');
sqlite> INSERT INTO a VALUES (NULL, 'test3');
sqlite> SELECT * FROM a;
a b
---------- ----------
1 test
2 test2
3 test3
SQLite 2.8.16 ではうまくいった.
では,INTEGER PRIMARY KEY に NOT NULL を指定するとどうなるか.
sqlite> CREATE TABLE b (a INTEGER NOT NULL PRIMARY KEY, b TEXT);
sqlite> INSERT INTO b VALUES (NULL, 'test');
sqlite> INSERT INTO b VALUES (NULL, 'test2');
sqlite> INSERT INTO b VALUES (NULL, 'test3');
sqlite> SELECT * FROM b;
a b
---------- ----------
1 test
2 test2
3 test3
sqlite> INSERT INTO b (b) VALUES ('test4');
sqlite> SELECT * FROM b;
a b
---------- ----------
1 test
2 test2
3 test3
4 test4
これもうまくいく.
- SQLite 3.x の場合
$ sqlite3 test.db3
SQLite version 3.1.3
Enter ".help" for instructions
sqlite> CREATE TABLE a (a INTEGER PRIMARY KEY, b TEXT);
sqlite> INSERT INTO a VALUES (NULL, 'test');
sqlite> INSERT INTO a VALUES (NULL, 'test2');
sqlite> INSERT INTO a VALUES (NULL, 'test3');
sqlite> SELECT * FROM a;
a b
---------- ----------
1 test
2 test2
3 test3
SQLite 3.1.3 の場合も 2.x と同様にうまくいく.
INTEGER PRIMARY KEY に NOT NULL を指定するとどうなるか.
sqlite> CREATE TABLE b (a INTEGER NOT NULL PRIMARY KEY, b TEXT);
sqlite> INSERT INTO b VALUES (NULL, 'test');
sqlite> INSERT INTO b VALUES (NULL, 'test2');
sqlite> INSERT INTO b VALUES (NULL, 'test3');
sqlite> SELECT * FROM b;
a b
---------- ----------
1 test
2 test2
3 test3
sqlite> INSERT INTO b (b) VALUES ('test4');
sqlite> SELECT * FROM b;
a b
---------- ----------
1 test
2 test2
3 test3
4 test4
こちらもうまくいく.
- まとめ
INTEGER NOT NULL PRIMARY KEY
でも
INTEGER PRIMARY KEY
どちらでも OK.
- sqlite_last_insert_rowid
http://www.php.net/sqlite_last_insert_rowid
- 追記
2.8.16 の場合を修正.NOT NULL を指定してもうまくいった.