在SQLite中设置AUTOINCREMENT的起始值

时间:2009-03-28 14:44:19

标签: sqlite

如何在SQLite中设置AUTOINCREMENT字段的起始值?

6 个答案:

答案 0 :(得分:88)

来自SQLite web site

  

SQLite使用特殊的SQLITE_SEQUENCE表跟踪表所拥有的最大ROWID。只要创建包含AUTOINCREMENT列的普通表,就会自动创建并初始化SQLITE_SEQUENCE表。可以使用普通的UPDATE,INSERT和DELETE语句修改SQLITE_SEQUENCE表的内容。 但是对此表进行修改可能会扰乱AUTOINCREMENT密钥生成算法。在进行此类更改之前,请确保您知道自己在做什么。

我尝试了这个,它有效:

UPDATE SQLITE_SEQUENCE SET seq = <n> WHERE name = '<table>'

其中 n +1是您想要的下一个ROWID, table 是表名。

答案 1 :(得分:24)

value-1显式插入表中,然后删除该行。

编辑:下一个评论向下,讨论直接编辑SQLITE_SEQUENCE表可能更可取:https://stackoverflow.com/a/692871/10093

答案 2 :(得分:17)

我使用下面的查询解决了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;

答案 3 :(得分:6)

执行此操作的一种方法是插入第一行明确指定要以开头的行ID。然后SQLite将插入高于前一个最高的行ID。

答案 4 :(得分:4)

在使用SQLITE_SEQUENCE表的解决方案中,在第一次插入表中并添加了自动增量列后,似乎会添加此表中的条目。在某些情况下,这可能会导致麻烦(即自动增量仍然从1开始,而不是从想要的值开始)。

答案 5 :(得分:1)

只想在iTech非常感谢的答案中添加一些注释:

  • sqlite_sequence中的名称列区分大小写。 (也许只有我一个人,但我总是假设来自其他数据库的字符串比较不区分大小写)。
  • SQLite似乎很健壮:如果sqlite_sequence中的数字错误并且会导致重复的rowid值,则sqlite将使用下一个可用的数字作为rowid(已通过sqlite 3.28检查)
  • 如果删除sqlite_sequence中的行,则为true。
  • 我在注释中建议使用“ sqlite_sequence WHERE name ='table'中不存在SELECT的名称”,而不是检查“ changes()”