sqliteのautoincrementとmysqlのauto_incrementの違い

4月 26th, 2011

sqliteのautoincrementをmysqlのauto_incrementと同じように使おうとして、DELETEした場合に一部挙動の違う所でハマったので検証がてらメモ。

sqliteはテーブル作成の際にINTEGER PRIMARY KEYでautoincrementをしてくれるとの事。

まずは、検証用テーブル作成

sqlite> CREATE TABLE test (
...>     seq INTEGER PRIMARY KEY,
...>     name TEXT
...> );

データ登録

sqlite> INSERT INTO test (name) VALUES ('Item1');

データ表示

sqlite> SELECT * FROM test;
seq|name
1|Item1

更にデータ追加

sqlite> INSERT INTO test (name) VALUES ('Item2');

データ表示

sqlite> SELECT * FROM test;
seq|name
1|Item1
2|Item2

Item1を削除

sqlite> DELETE FROM test WHERE seq = 1;

データ表示

sqlite> SELECT * FROM test;
seq|name
2|Item2

Item3を追加

sqlite> INSERT INTO test (name) VALUES ('Item3');

データ表示

sqlite> SELECT * FROM test;
seq|name
2|Item2
3|Item3

Item3を削除

sqlite> DELETE FROM test WHERE seq = 3;

Item4を追加

sqlite> INSERT INTO test (name) VALUES ('Item4');

データ表示

sqlite> SELECT * FROM test;
seq|name
2|Item2
3|Item4

※ここで、mysqlならばseqが4になる。それを期待していたがsqliteではseqは3として登録される。

今度は全削除

sqlite> DELETE FROM test;

Item5を追加

sqlite> INSERT INTO test (name) VALUES ('Item5');

データ表示

sqlite> SELECT * FROM test;
seq|name
1|Item5

※全削除の後に追加すると1から始まる。

・結論
sqliteのautoincrementはPRIMARY KEYに指定したカラムの「その時点での最小値+1」でデータ登録が行われる。

sqliteを使用したシステムで、設計の際にDELETE発行するシステムを組むと、
リレーションがおかしくなる可能性が有るため注意が必要。

調べてみると、sqlite公式のFAQにも書かれてた・・・。
http://www.sqlite.org/faq.html#q1

やっぱりちゃんとマニュアルや公式サイトで確認しないとダメですね。

mysqlと同じ感覚で使っていた・・・反省。

カテゴリー: mysql, 開発

Leave a comment

Leave a comment

コメントは承認待ちです。表示されるまでしばらく時間がかかるかもしれません。

Feed

http://blog.yume-dia.jp / sqliteのautoincrementとmysqlのauto_incrementの違い