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 を指定してもうまくいった.

この記事へのコメント
SQLite 2.8.17でINTEGER NOT NULL PRIMARY KEYできましたよ。
PerlのモジュールDBD::SQLite2(SQLite 2.8.15)でもできました。
ひょっとして2.8.16固有のバグかな?
(手元に2.8.16がないのでほんとにぢきないのかは未確認ですが)
通りすがり | 2006/02/15 (Wed) 02:38:41
SQLite 2.8.14 でも出来ました.
もう一度試してみたら 2.8.16 でも出来ますね…
何だったのでしょう…?
記事を訂正しておきました.
sunaoka | 2006/02/15 (Wed) 02:50:36
SQLiteで検索してたどり着きました。
INTEGERをINTと表記した時、かつNOT NULL指定時。
auto incrementしてくれるだろうと思ってたら
NOT NULLだから値を入力しなさいと怒られた事がありましたよ。
バージョンは、複数サーバーでモジュールとコマンドライン(これ別の本体ですよね)が
混在してるから、もう一度調べる気は起きませんが・・・。
NOT NULLは指定しておかない方がよさげですね。
なんかモドカシイですが。
別の通りすがり | 2007/06/10 (Sun) 11:14:42