1

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

_id integer primary key

没有自动增量。

在这里,我对删除后插入期间如何更新 rowid 有疑问。我观察到的是

  1. 如果最后一行 id 是 x 并且它被删除,则插入的下一行得到 id x。

但是,如果我删除 id < x 的其他一些行,然后插入新行,则新插入行的 rowid 为 x+1 。

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

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

4

2 回答 2

3

如果没有自动增量集,该行将是 ROWID 的别名...

常见问题解答是这样说的:

如果插入时没有指定 ROWID,或者指定的 ROWID 的值为 NULL,则会自动创建适当的 ROWID。通常的算法是给新创建的行一个比插入前表中最大的 ROWID 大一的 ROWID。如果表最初为空,则使用 1 的 ROWID。如果最大的 ROWID 等于最大可能的整数 (9223372036854775807),则数据库引擎开始随机挑选正候选 ROWID,直到找到以前未使用的 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 回答