【メモ】 SQLite3でのAUTO INCREMENT。

SQLite2で自動的にインクリメント(autoincrement)されるフィールドを作るためには、そのフィールドに次のように設定してやれば実現できました。

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」キーを付加して設定してやった方が良さそうですね。

…またテーブル作り直しか。。
まぁまだそんなに手間じゃないから良いんですけどね。