Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQLite中设置自动增量的起始值_Sqlite - Fatal编程技术网

在SQLite中设置自动增量的起始值

在SQLite中设置自动增量的起始值,sqlite,Sqlite,如何在SQLite中设置自动增量字段的起始值?将值-1显式插入表中,然后删除行 编辑:下面的注释讨论直接编辑SQLITE_序列表,这可能更可取:一种方法是插入第一行,明确指定要开始的行id。SQLite然后将插入比以前最高的行ID更高的行ID。来自: SQLite使用特殊的SQLite_序列表跟踪一个表所拥有的最大ROWID。每当创建包含自动增量列的普通表时,就会自动创建并初始化SQLITE_序列表。SQLITE_序列表的内容可以使用普通的UPDATE、INSERT和DELETE语句进行修改。但

如何在SQLite中设置自动增量字段的起始值?

将值-1显式插入表中,然后删除行


编辑:下面的注释讨论直接编辑SQLITE_序列表,这可能更可取:

一种方法是插入第一行,明确指定要开始的行id。SQLite然后将插入比以前最高的行ID更高的行ID。

来自:

SQLite使用特殊的SQLite_序列表跟踪一个表所拥有的最大ROWID。每当创建包含自动增量列的普通表时,就会自动创建并初始化SQLITE_序列表。SQLITE_序列表的内容可以使用普通的UPDATE、INSERT和DELETE语句进行修改。但对该表进行修改可能会干扰自动增量密钥生成算法。在进行此类更改之前,请确保您知道自己在做什么

我试过这个,效果很好:

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

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

在使用SQLITE\u序列表的解决方案中,此表中的条目似乎是在第一次插入到带有autoincrement列的表中后添加的。在某些情况下,这可能会导致问题,即autoincrement仍然从1开始,而不是从想要的值开始。

我使用下面的查询解决了sqlite_序列没有表记录时的问题,即第一条记录尚未添加到表中,否则它会更新序列

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;

我只是想对iTech非常感谢的回答补充几点:

sqlite_序列中的name列区分大小写。也许只有我一个人,但从其他数据库来看,我总是认为字符串比较不区分大小写。 SQLite似乎很健壮:如果SQLite_序列中的数字错误,并且会导致重复的rowid值,SQLite将使用SQLite 3.28检查的rowid的下一个可用数字 如果sqlite_序列中的行被删除,情况也是如此。 我在一条注释中建议使用WHERE NOT EXISTS从sqlite_序列中选择名称,其中名称='table',而不是检查更改
不确定,因为我不确定sqlite内部如何工作。值得注意的是,jle和我上面的建议是PHP的MDB2库如何支持更改id的。看看他们的sqlite驱动程序源代码:我认为完整性不是问题,不是专家或其他什么。我认为他们警告的问题是,如果删除ID小于MAXID的行,并尝试以这种方式手动设置自动增量。由于主键冲突,您将在第一个插入行之后被卡住。链接页面上记录了确切的算法,并且不会在任何3.x版本中更改以保持兼容性。完美!简单而优雅的解决方案。唯一的问题是,如果sqlite_序列中还没有该表的条目,那么这将不起作用。请看iTech的答案,了解正确的方法。我想这是最好的方法,但它并不漂亮。这对我不起作用。如果我有一个只有1个条目id 1的表用户,而auto increment为3,则插入另一个id为-1的用户,然后将其删除,下一个插入的用户仍然是id为4的firefox SQLite manager extension,如果它有区别的话,就像一个解决方法一样。我更喜欢为讨论中的表寻址sqlite_序列表记录。这是这里唯一完全正确的解决方案。巫毒的变化让我的眼睛流泪;为什么在这里使用“变更”?您不能这样做:如果不存在,请从sqlite_序列中选择名称,其中名称='table'