sqlite在回滚后重复主键自动增量值
我预计sqlite将丢弃已使用和回滚(ed)PK值,但不会以这种方式发生。以下是测试: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(
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序列
表的操作。因此,它的值更改仅在提交时适用。所以简单的回答是“不可能”。。。