2

我想在 SQLite 表中插入一些数据,其中一列用于保存字符串值,另一列用于保存序列号。

SQLite 文档说自动增量不能保证顺序插入。而且我不想跟踪以前插入的序列号。

有什么方法可以顺序存储数据,而不跟踪先前插入的行?

4

3 回答 3

1

简短的回答是你是对的,自动增量文档清楚地表明它INTEGER PRIMARY KEY AUTOINCREMENT会不断增加,尽管正如你指出的那样,你使用的不一定是顺序的。因此,您显然必须修改您的代码,使其不依赖于顺序值(这可能是正确的做法),或者您必须自己维护自己的顺序标识符。我确定这不是您要寻找的答案,但我认为这是实际情况。

于 2012-12-24T07:38:14.340 回答
1

简短的回答:不要担心 AUTOINCREMENT id 序列中的空白。在处理事务数据库时,它们是不可避免的。

长答案:SQLite 不能保证 AUTOINCREMENT 总是加一,原因是事务。

假设您有 2 个数据库连接,几乎同时启动了 2 个并行事务。第一个获得了一些 AUTOINCREMENT id,它变成了以前使用的值 +1。一个滴答后,第二笔交易获得了下一个 id,现在是 +2。现在想象第一个事务由于某种原因回滚(遇到一些错误,代码决定中止它,程序崩溃等)。之后,第二个事务将提交 id +2,从而在 id 编号上产生间隙。

现在,如果此类并行事务的数量高于 2 怎么办?您无法预测,也无法告诉当前正在运行的事务重用出于任何原因未使用的 id。

于 2012-12-25T09:31:15.430 回答
0

如果您将数据按顺序插入 SQLite 数据库,它们将按顺序存储。

文档the automatically generated ROWIDs are guaranteed to be monotonically increasing.

因此,例如,如果您想为 建立一个表Person,那么您可以使用以下命令创建具有自动增量的表。

CREATE table PERSON (personID integer PRIMARY KEY AUTOINCREMENT, personName string)

链接:http ://www.sqlite.org/autoinc.html

于 2012-12-24T07:42:30.520 回答