我有一个表,其中字段
ID
是自动递增的 INTEGER PRIMARY KEY
。如果 ID
将在下一个 n
上自动递增到某个整数值 INSERT
,我如何在 n
语句中访问值 INSERT
?
特别是,我有时希望用 negative
ID
来初始化一行,即 ID = -n
(原因是除了主键之外,我还使用 ID
作为布尔标志,这样我就不必仅为该标志创建单独的字段)。
你不能。行 ID 生成仅在稍后启动,而不是在计算 SQL 中的表达式时启动。有
last_insert_rowid()
但没有 current_insert_rowid()
。
此外,重载 rowid 以包含标识符之外的其他信息似乎不是一个好主意。只需使用其他列即可获取更多信息。
正如 laalto 所说,您无法访问 AUTOINCRMENT 的下一个值,但如果您确实需要的话,有一个解决方法。请注意,这不是一种最佳的处理方式,而且它不是线程安全的,所以除非你真的需要它 - 不要使用它。
考虑到 SQLite 中“INTEGER PRIMARY KEY”的特殊处理,我们可以使用:
SELECT max(the_column) + 1 FROM table;
然后使用返回的值并在对 PK 列执行 INSERT 时显式放置它。
注意,这与使用自动增量机制本身不同。自动增量将始终增加 id,而我们的“解决方法”将始终使用当前的最大值,如果删除所有行,它将从 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);
但这可能不是线程安全的。