如何获得当前的自动增量值

时间:2012-12-13 13:12:40

标签: database sqlite

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

2 个答案:

答案 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>