sqlite在回滚后重复主键自动增量值

时间:2015-01-14 16:24:44

标签: sqlite

我希望sqlite会丢弃used和rollback(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
);

插入失败的手动says跳过尝试使用的PK值,但注意到回滚 问题是:是否有一些设置可以管理此行为?或技巧?

Ms Sql Server以我期望的方式工作。 PHP 5.4.11下的Sqlite版本是3.7.7.1

1 个答案:

答案 0 :(得分:3)

SQLite docs中有一些微妙的语言。 (重点补充。)

  

换句话说,AUTOINCREMENT的目的是防止重用   ROWID 来自之前删除的行

这与客户端/服务器SQL dbms略有不同,后者必须处理并发写入。 SQLite需要exclusive lock for writes

  

使用AUTOINCREMENT,具有自动选择的ROWID的行是   保证之前从未使用使用的ROWID   表在同一个数据库中。

这意味着保证与提交的行有关。这意味着未提交的行的ID号不会在"之前使用。 (在这个意义上)在表中。

  

但是,如果插入因(例如)唯一性而失败   约束,失败的插入尝试的ROWID 可能不是   在后续插入时重用,导致ROWID序列中存在间隙。

留下重用的可能性。

相关问题