1

データベースにテーブルがあり、1 つのフィールドが次のように宣言されています。

_id integer primary key

AUTOINCREMENT はありません。

ここで、削除後の挿入中にrowidがどのように更新されるかについて疑問があります。私が観察したことは

  1. 最後の行 ID が x で、それが削除された場合、挿入された次の行は ID x を取得します。

しかし、id < x の他の行を削​​除してから新しい行を挿入すると、新しく挿入された行の行 ID は x+1 になります。

私の観察権であることを確認してください(行間ではなく、最後の行が削除された場合にのみ行IDが再利用されます。)

AUTOINCREMENT の説明を見ました。AUTOINCREMENT が設定されていない場合の動作を知りたい

4

2 に答える 2

3

自動インクリメント セットがないと、行は ROWID のエイリアスになります...

これは、よくある質問に次のように書かれています。

挿入時に ROWID が指定されていない場合、または指定された ROWID の値が NULL の場合、適切な ROWID が自動的に作成されます。通常のアルゴリズムでは、新しく作成された行に、挿入前のテーブル内の最大の ROWID よりも 1 大きい ROWID を指定します。テーブルが最初に空の場合、1 の ROWID が使用されます。最大の ROWID が可能な最大の整数 (9223372036854775807) と等しい場合、データベース エンジンは、以前に使用されていないものを見つけるまで、正の候補の ROWID をランダムに選択し始めます。適切な回数試行しても未使用の ROWID が見つからない場合、挿入操作は SQLITE_FULL エラーで失敗します。負の ROWID 値が明示的に挿入されない場合、自動的に生成される ROWID 値は常にゼロより大きくなります。

前述の通常の ROWID 選択アルゴリズムは、最大の ROWID 値を使用せず、最大の ROWID を持つテーブル内のエントリを削除しない限り、単調に増加する一意の ROWID を生成します。行を削除したり、最大の ROWID を持つ行を作成したりすると、以前に削除された行の ROWID が新しい行の作成時に再利用され、新しく作成された ROWID が厳密に昇順でなくなる可能性があります。

于 2012-03-12T07:30:51.063 に答える
3

SQLite テーブルが主キー値を自動的に生成するために AUTOINCREMENT キーワードは必要ありません。データベースに追加するものはすべて最後の行として追加されます...したがって、最後の行 (x) を削除すると、新しい要素が追加されます。 x位置で..途中から削除するかどうか..追加時の新しい要素はx + 1位置に移動します...

自動インクリメントの使用について.. x 位置の最後の要素を削除すると、次の ID x+1 が自動インクリメント アルゴリズムによって生成されます.. x+1 位置で次の追加を行います..

于 2012-03-12T07:31:01.613 に答える