插入时android sqlite数据库rowid增量

时间:2012-03-12 07:18:23

标签: android sqlite rowid

我的数据库中有一个表,其中一个字段声明为

_id integer primary key

没有AUTOINCREMENT。

这里我怀疑删除后插入过程中rowid的更新方式。我观察到的是

  1. 如果最后一行id为x且被删除,则插入的下一行将获得id x。
  2. 但是如果我删除其他一些id为< x然后插入一个新行,新插入的行的rowid是x + 1。

    请确认我的观察权是否正确(仅当最后一行被删除而且不在行之间时才重复使用rowid。)

    我看到了AUTOINCREMENT的解释。我想知道没有设置AUTOINCREMENT时的行为

2 个答案:

答案 0 :(得分:3)

如果没有设置自动增量,该行将是ROWID ...

的别名

这就是FAQ所说的:

如果在插入上未指定ROWID,或者指定的ROWID的值为NULL,则会自动创建适当的ROWID。通常的算法是为新创建的行提供一个ROWID,该ROWID比插入前表中的最大ROWID大一个。如果表最初为空,则使用ROWID为1。如果最大的ROWID等于最大可能的整数(9223372036854775807),则数据库引擎随机开始随机选择正候选ROWID,直到找到之前未使用过的ROWID。如果在合理的尝试次数后找不到未使用的ROWID,则插入操作将失败,并显示SQLITE_FULL错误。如果未明确插入负ROWID值,则自动生成的ROWID值将始终大于零。

上述正常的ROWID选择算法将生成单调递增的唯一ROWID,只要您从不使用最大ROWID值,并且永远不会删除具有最大ROWID的表中的条目。如果您删除了行或者您创建了一个具有最大可能ROWID的行,那么在创建新行时可能会重用以前删除的行中的ROWID,而新创建的ROWID可能不会严格按升序排列。

答案 1 :(得分:3)

SQLite表不需要AUTOINCREMENT关键字来自动生成主键值。  什么你添加到数据库将添加为最后一行...所以如果你删除最后一行(x)..新元素将添加在x位置..如果你从中间删除或不..新元素上加法将转到x + 1位置......

使用自动增量..如果你删除x位置的最后一个元素,下一个id x + 1将由autoincrement算法生成.. makin下一个添加在x + 1位置..