1

如何在打开数据库后立即获取特定表的最后一个自动增量值?这不是last_insert_rowid()因为没有插入事务。换句话说,我想提前知道在为特定表插入新行时会选择哪个数字自动增量。

4

2 回答 2

1

不同的数据库以不同的方式实现自动增量。但据我所知,他们都不会回答你提出的问题。

自动增量功能旨在为新添加的表行创建唯一 ID。如果尚未插入行,则该功能尚未生成 id。

这是有道理的......如果你确实得到了下一个自动增量编号,你会用它做什么?可能的意图是将其分配为尚未插入的新行的主键。但是在您获得 id 和使用它插入行的时间之间,数据库可以使用该 id 为另一个进程插入一行。

您的选择是:自己管理 id 的创建,或者等到插入行后再使用其自动创建的标识符。

于 2012-12-13T13:48:44.173 回答
1

这取决于如何定义自动增量列。

如果列定义为INTEGER PRIMARY KEY AUTOINCREMENT,则 SQLite 将在名为 的内部表中保留最大 ID sqlite_sequence

如果列定义不包含关键字AUTOINCREMENT,SQLite 将使用其“常规”例程来确定新 ID。从文档中:

通常的算法是给新创建的行一个比插入前表中最大的 ROWID 大一的 ROWID。如果表最初为空,则使用 1 的 ROWID。如果最大的 ROWID 等于最大可能的整数 (9223372036854775807),则数据库引擎开始随机挑选正候选 ROWID,直到找到以前未使用的 ROWID。如果在合理的尝试次数后找不到未使用的 ROWID,则插入操作将失败并出现SQLITE_FULL错误。如果没有显式插入负 ROWID 值,则自动生成的 ROWID 值将始终大于零。

我记得读过,对于没有 的列AUTOINCREMENT,确定下一个 ID 的唯一可靠方法是首先VACUUM数据库;这会将所有 ID 计数器重置为该表的最大现有 ID + 1。但我再也找不到那个引用了,所以这可能不再正确。


也就是说,我同意slash_rick_dot的观点,即预先获取自动递增的 ID 是一个坏主意,尤其是在另一个进程可能同时写入数据库的可能性很小的情况下。

于 2012-12-13T14:43:37.667 回答