【发布时间】:2010-10-16 02:59:33
【问题描述】:
如何在 SQLite 中设置 AUTOINCREMENT 字段的起始值?
【问题讨论】:
标签: sqlite
如何在 SQLite 中设置 AUTOINCREMENT 字段的起始值?
【问题讨论】:
标签: sqlite
SQLite 使用特殊的
SQLITE_SEQUENCE表来跟踪表所拥有的最大 ROWID。每当创建包含 AUTOINCREMENT 列的普通表时,就会自动创建和初始化SQLITE_SEQUENCE表。SQLITE_SEQUENCE表的内容可以使用普通的 UPDATE、INSERT 和 DELETE 语句进行修改。 但修改此表可能会干扰 AUTOINCREMENT 密钥生成算法。在进行此类更改之前,请确保您知道自己在做什么。
我试过了,效果很好:
UPDATE SQLITE_SEQUENCE SET seq = <n> WHERE name = '<table>'
n+1 是你想要的下一个 ROWID,table 是表名。
【讨论】:
将value-1 显式插入表中,然后删除该行。
编辑:下一条评论,讨论直接编辑SQLITE_SEQUENCE 表可能更可取:https://stackoverflow.com/a/692871/10093
【讨论】:
我正在使用下面的查询来解决当 sqlite_sequence 没有表记录时的问题(即第一条记录尚未添加到表中),否则它会更新序列。
BEGIN TRANSACTION;
UPDATE sqlite_sequence SET seq = <n> WHERE name = '<table>';
INSERT INTO sqlite_sequence (name,seq) SELECT '<table>', <n> WHERE NOT EXISTS
(SELECT changes() AS change FROM sqlite_sequence WHERE change <> 0);
COMMIT;
【讨论】:
一种方法是插入第一行明确指定要开始的行 ID。然后 SQLite 将插入高于前一个最高值的行 ID。
【讨论】:
在使用 SQLITE_SEQUENCE 表的解决方案中,该表的条目似乎是在第一次插入具有自动增量列的表之后添加的。在某些情况下,这可能会导致问题(即自动增量仍然从 1 开始,而不是从想要的值开始)。
【讨论】:
只是想为 iTech 非常感谢的回答添加一些注释:
【讨论】: