Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/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将丢弃已使用和回滚(ed)PK值,但不会以这种方式发生。以下是测试: PRAGMA foreign_keys = ON; BEGIN TRANSACTION; INSERT INTO _UIDlgt (id, TS) VALUES (null, '1421248181'); select max(id) from _UIDlgt; -- shows 6 ok, there were previous records ROLLBACK; select max(

我预计sqlite将丢弃已使用和回滚(ed)PK值,但不会以这种方式发生。以下是测试:

PRAGMA foreign_keys = ON;
BEGIN TRANSACTION;
INSERT INTO _UIDlgt (id, TS) VALUES (null, '1421248181');
select max(id) from _UIDlgt;         -- shows  6  ok, there were previous records
ROLLBACK;
select max(id) from _UIDlgt;         -- shows  5  ok, was previous max value
INSERT INTO _UIDlgt (id, TS) VALUES (null, '1421248181');
select max(id) from _UIDlgt;         -- shows  6  I expect 7 !!!!
这是表的创建过程:

CREATE TABLE _UIDlgt (
   id              INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, 
   TS              INTEGER NOT NULL
);
插入失败的手册跳过尝试使用的PK值,但注意回滚。
问题是:是否有一些设置来管理这种行为?还是一个技巧


Ms Sql Server按我预期的方式工作。Sqlite版本是PHP5.4.11下的3.7.7.1

中有一些微妙的语言。(重点加上。)

换句话说,自动增量的目的是防止重用 以前删除的行中的行ID的数目

这与客户机/服务器SQL dbms略有不同,后者必须处理并发写入。SQLite需要一个

使用AUTOINCREMENT时,将显示自动选定行ID的行 保证有以前从未被使用过的rowid 表在同一数据库中

这意味着保证与提交的行有关。这意味着未提交行的id号不会在表中“以前使用”(从这个意义上说)

但是,如果由于(例如)唯一性而导致插入失败 约束,则插入尝试失败的ROWID可能不可用 在后续插入中重复使用,导致ROWID序列中出现间隙


保留了重用的可能性。

回滚会删除所有挂起的写入操作,而autoincrement是一种写入特殊
sqlite\u序列
表的操作。因此,它的值更改仅在提交时适用。所以简单的回答是“不可能”。。。