【问题标题】:android sqllite database rowid increment while insertion插入时android sqlite数据库rowid增量
【发布时间】:2012-03-28 14:46:59
【问题描述】:

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

_id integer primary key

没有自动增量。

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

  1. 如果最后一行 id 为 x 并被删除,则插入的下一行获得 id x。

但是如果我删除了其他一些 id

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

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

【问题讨论】:

    标签: android sqlite rowid


    【解决方案1】:

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

    关于使用自动增量.. 如果您删除 x 位置的最后一个元素,则下一个 id x+1 将由自动增量算法生成.. 在 x+1 位置进行下一个添加..

    【讨论】:

    • 这是我看到的行为。是否有任何文件解释这一点。请分享。
    • 如果你有 92​​23372036854775807 行并删除一些(不是最后一行?)会发生什么,请参阅我的答案。
    • 关于使用自动增量,否则下一次添加将转到 9223372036854775807+1 行...[如果不删除最后一行]..如果删除最后一行.. 9223372036854775807+1 位置上使用自动增量..在这种情况下9223372036854775807这个条目是空的..如果你不使用自动增量下一个添加将转到9223372036854775807位置...这是我从文档中理解的..如果我错了请纠正我.. =]
    【解决方案2】:

    如果没有设置自动增量,该行将是 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 可能不会严格按照升序排列。

    【讨论】:

    • 谢谢。这是设置自动增量时的行为。我想知道默认情况下整数主键是否是自动增量的。我在插入期间没有指定和行值。
    • 没有。这是未设置自动增量时的行为。
    • 我的帖子解释了值如何被重用ROWID 应该回答你的问题。 (如果您从表中删除最大 ID,它将被重用,如果表使用最大 ID,它将搜索空闲的 LOWER ID,这不会发生在设置 AUTO INCREMENT 的情况下)
    猜你喜欢
    • 2011-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多