2011-12-29 19 views
3

私はSQLite DBファイルを持っています。そして、テーブルには100行あります。私が与えるとき行を削除した後もSQL Liteの空の行ID

SELECT * FROM a WHERE rowid BETWEEN 1 AND 100 

それは私に最初の100の結果を与える。テーブルから最初の2行を削除して実行すると、

SELECT * FROM a WHERE rowid BETWEEN 1 AND 100 

私には98行しか与えられません。クエリを実行すると、

SELECT * FROM a WHERE rowid = 1 

空の行が表示されます。データベースはROWIDを再配置していないようです。

助けてください。SQLiteに強制的に行IDを再配置する方法はありますか?

+0

"空の行"とはどういう意味ですか? –

+0

スクリーンショットを投稿できますか? –

+0

質問に「mysql」とタグをつけたのはなぜですか? – Tadeck

答えて

1

SQLiteでは、rowidはちょうどautoincrementedの値を持つint列です。あなたが保証している唯一のことは、それぞれのROWIDがそのテーブルに固有のものであることです。 ROWIDが連続していることは保証されておらず、すべての数字が使用されることさえ保証されていません!たとえば、INSERTが失敗した場合、その失敗した挿入で使用されたROWIDはスキップされ、再度使用されることはありません(autoincrementキーワードが明示的に使用されている場合は - そうでなければ、行が削除されると、そのROWIDは、新しく挿入されたデータ)

ROWIDを順次自動更新するには、独自のバージョンのROWID列を作成し、それをトリガーで更新しておく必要があります。

+0

ありがとうございますが、空の行を自動修正するには真空を実行する必要があります。自分のrow_idをメインテナンスするよりもはるかに簡単です。 – NoobieDude

+0

@ジェバ私はあなたの唯一の選択肢だと恐れています。 SQLiteで 'rowid'の動作を変更することはできません。つまり、SQLiteのソースコードを入手して変更して、その機能を追加する場合を除きます。 – ean5533

0

私は答えを見つけました。削除するたびにVacuumクエリを実行する必要があります。これにより、すべての行インデックスが再配置され、不通行が削除されます。

http://sqlite.org/lang_vacuum.html

関連する問題