SQLite で auto-increment なフィールドを作成する方法

comments(4) | trackback(3)

はてなブックマークに追加 はてなブックマーク数 del.icio.us に追加 livedoor クリップに追加 livedoor クリップ数 Yahoo!ブックマークに追加

  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][PHP][MySQL]

この記事へのコメント

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

別の通りすがりさんが書かれていますが、当方でもINTEGER PRIMARY KEY項目
にNOT NULLを指定すると、SQLによっては「そこはNOT NULLなんで」って怒られ
る事がありました。NOT NULL指定を外すことで回避。

ADO.NETのドライバによってもこの辺の挙動が変わる気がします。

更に別の通りすがり | 2009/05/22 (Fri) 16:51:53

この記事へのコメントを書く

名前:

メールアドレス (公開されません):

URL:

コメント (入力必須)

この記事へのトラックバック URL

http://cl.pocari.org/tb.php/2006-02-12-1

この記事へのトラックバック

[scuttle][sqlite]ScuttleをSQLiteで動かす

ScuttleはSQLiteで動きそうな事が設定ファイルとかに書かれているのに、ちゃんと動かない。 PostgreSQLもやはり同じようで、パッチが出ている。 SQLiteも原因は大体同じで、中に書かれているSQLが使えなかったり、コードが足りなかったりするのが原因。 という事で、動くよ

ZeBeVogue別館 | 2008/04/05 (Sat) 20:38:52

【PHP】SQLiteでauto-increment

SQLiteでauto-incrementさせる方法 ...

weblog21 | 2008/10/31 (Fri) 05:38:10

ASP.NET Dynamic Data + ADO.NET Entity Framework ...

先日、ASP.NET Dynamic Data + ADO.NET Entity Framework で SQLite を扱うエントリを投稿したが、一点、不具合があった。主キーとして auto-increment な列、いわゆる \"オートナンバー\" 列として作成してあるテーブルについて、ASP.NET Dynamic Data の [...

Developer @ ADJUST | 2009/01/15 (Thu) 22:27:21