SQLite - 如何访问 INSERT 上的自动增量值?

问题描述 投票:0回答:3

我有一个表,其中字段

ID
是自动递增的
INTEGER PRIMARY KEY
。如果
ID
将在下一个
n
上自动递增到某个整数值
INSERT
,我如何在
n
语句中访问值
INSERT

特别是,我有时希望用 negative

ID
来初始化一行,即
ID = -n
(原因是除了主键之外,我还使用
ID
作为布尔标志,这样我就不必仅为该标志创建单独的字段)。

sqlite auto-increment
3个回答
2
投票

你不能。行 ID 生成仅在稍后启动,而不是在计算 SQL 中的表达式时启动。有

last_insert_rowid()
但没有
current_insert_rowid()

此外,重载 rowid 以包含标识符之外的其他信息似乎不是一个好主意。只需使用其他列即可获取更多信息。


1
投票

正如 laalto 所说,您无法访问 AUTOINCRMENT 的下一个值,但如果您确实需要的话,有一个解决方法。请注意,这不是一种最佳的处理方式,而且它不是线程安全的,所以除非你真的需要它 - 不要使用它。

考虑到 SQLite 中“INTEGER PRIMARY KEY”的特殊处理,我们可以使用:

SELECT max(the_column) + 1 FROM table;

然后使用返回的值并在对 PK 列执行 INSERT 时显式放置它。

注意,这与使用自动增量机制本身不同。自动增量将始终增加 id,而我们的“解决方法”将始终使用当前的最大值,如果删除所有行,它将从 0 开始,而自动增量将继续使用它留下的数字。

放心 - 这是一种解决方法,除非您真的知道自己在做什么并且仍然需要它,否则不要使用它。


0
投票

如果删除表末尾的行,Googie 的答案将不起作用。您可以通过

SELECT seq FROM sqlite_sequence WHERE name = 'my_table'

获取自增计数器
INSERT INTO my_table (other_id) VALUES ((SELECT seq FROM sqlite_sequence WHERE name = 'my_table')+1);

但这可能不是线程安全的。

© www.soinside.com 2019 - 2024. All rights reserved.