我想在 SQLite 表中插入一些数据,其中一列用于保存字符串值,另一列用于保存序列号。
SQLite 文档说自动增量不能保证顺序插入。而且我不想跟踪以前插入的序列号。
有什么方法可以顺序存储数据,而不跟踪先前插入的行?
简短的回答是你是对的,自动增量文档清楚地表明它INTEGER PRIMARY KEY AUTOINCREMENT
会不断增加,尽管正如你指出的那样,你使用的不一定是顺序的。因此,您显然必须修改您的代码,使其不依赖于顺序值(这可能是正确的做法),或者您必须自己维护自己的顺序标识符。我确定这不是您要寻找的答案,但我认为这是实际情况。
简短的回答:不要担心 AUTOINCREMENT id 序列中的空白。在处理事务数据库时,它们是不可避免的。
长答案:SQLite 不能保证 AUTOINCREMENT 总是加一,原因是事务。
假设您有 2 个数据库连接,几乎同时启动了 2 个并行事务。第一个获得了一些 AUTOINCREMENT id,它变成了以前使用的值 +1。一个滴答后,第二笔交易获得了下一个 id,现在是 +2。现在想象第一个事务由于某种原因回滚(遇到一些错误,代码决定中止它,程序崩溃等)。之后,第二个事务将提交 id +2,从而在 id 编号上产生间隙。
现在,如果此类并行事务的数量高于 2 怎么办?您无法预测,也无法告诉当前正在运行的事务重用出于任何原因未使用的 id。
如果您将数据按顺序插入 SQLite 数据库,它们将按顺序存储。
从文档:the automatically generated ROWIDs are guaranteed to be monotonically increasing.
因此,例如,如果您想为 建立一个表Person
,那么您可以使用以下命令创建具有自动增量的表。
CREATE table PERSON (personID integer PRIMARY KEY AUTOINCREMENT, personName string)