如何在打开数据库后立即获取特定表的最后自动增量值?它不是last_insert_rowid()
,因为没有插入事务。换句话说,我想事先知道在为特定表插入新行时自动增量将选择哪个数字。
答案 0 :(得分:1)
不同的数据库实现不同的自动增量。但据我所知,他们都不会回答你提出的问题。
自动增量功能旨在为新添加的表行创建唯一ID。如果尚未插入行,则该功能尚未生成id。
这是有意义的......如果你确实得到了下一个自动增量数字,你会用它做什么?可能的意图是将其指定为尚未插入的新行的主键。但是在你获得id的时间和你用它来插入行的时间之间,数据库可能已经使用该id为另一个进程插入一行。
您的选择是这样的:自己管理ID的创建,或等到插入行之后再使用自动创建的标识符。
答案 1 :(得分:1)
这取决于如何定义自动增量列。
如果列定义为INTEGER PRIMARY KEY AUTOINCREMENT
,则SQLite将在名为sqlite_sequence
的内部表中保留最大的ID。
如果列定义不包含关键字AUTOINCREMENT
,SQLite将使用其“常规”例程来确定新ID。来自documentation:
通常的算法是给新创建的行一个ROWID 一个大于插入前表中最大的ROWID。如果 该表最初为空,然后使用ROWID为1。如果 最大的ROWID等于最大可能的整数 (9223372036854775807)然后数据库引擎开始挑选正面 候选人ROWID随机,直到找到之前没有的 用过的。如果在合理数量之后没有找到未使用的ROWID 尝试,插入操作失败,出现SQLITE_FULL错误。如果不 显式插入负ROWID值,然后自动插入 生成的ROWID值将始终大于零。
我记得读到这一点,对于没有AUTOINCREMENT
的列,确定下一个ID的唯一可靠方法是首先VACUUM数据库;这将把所有ID计数器重置为该表的最大现有ID + 1.但我再也找不到这个引用了,所以这可能不再适用。
那就是说,我同意 slash_rick_dot 预先获取自动递增的ID是一个坏主意,特别是如果甚至有一个远程的可能性,另一个进程可能同时写入数据库。 / p>