- SQLite2の場合
id INTEGER NOT NULL PRIMARY KEY
SQLite3でも同様に設定してやれば、自動的にインクリメントされるフィールドを作成することが出来ます。
- SQLite3の場合
id INTEGER NOT NULL PRIMARY KEY または id INTEGER PRIMARY KEY
しかし、これらはあくまで「擬似的に」autoincrementを実現しているだけで、例えばMySQLのAUTO_INCREMENTととは動作が違うようです。SQLite3ではAUTOINCREMENTの指定をサポートしているので、MySQLのAUTO_INCREMENTと同様の動きをするフィールドを作成することが出来ます。設定は以下の通り。
- SQLite3の場合(その2)
id INTEGER PRIMARY KEY AUTOINCREMENT
違いは、「AUTOINCREMENT」キーの有る無しです。
2つの違いの詳細についてはこちらに記述されています。
SQLite Autoincrement(英語)
簡単に要約すると、擬似的に実現する手法の場合、新たに要素がINSERTされたときそれまで格納されているデータの中でもっとも大きなIDに1を足して新しいIDとします。
6 testdata
7 testdata ← 新規挿入
もし仮に一番大きなIDのレコードを削除してから新規に挿入するとどうなるか?答えは、削除されたIDが再び割り当てられる、です。
6 testdata
7 testdata ← 削除
6 testdata
6 testdata
7 testdata ← 新規挿入
一方、AUTOINCREMENTが付いたフィールドの場合、そのフィールドのIndexが今いくつであるかというデータを持ち、そのデータに基づいてこれまでに振ったIDとはかぶらない最大のIDを割り当てます。新規に挿入するだけなら、先ほどの動作と変わりませんが、一番大きなIDを削除してから挿入すると次のようになります。
6 testdata
7 testdata ← 削除
6 testdata
6 testdata
8 testdata ← 新規挿入
なるほどね。これは、MySQLでのAUTO_INCREMENTと同じ動作です。考えてみれば途中で削除があっても一意で決まる形の方が用途としては使いやすいかもしれません。
というわけで、SQLite3を使ってテーブルを作成するときは、主キーに「AUTOINCREMENT」キーを付加して設定してやった方が良さそうですね。
…またテーブル作り直しか。。
まぁまだそんなに手間じゃないから良いんですけどね。