我希望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
答案 0 :(得分:3)
SQLite docs中有一些微妙的语言。 (重点补充。)
换句话说,AUTOINCREMENT的目的是防止重用 ROWID 来自之前删除的行。
这与客户端/服务器SQL dbms略有不同,后者必须处理并发写入。 SQLite需要exclusive lock for writes。
使用AUTOINCREMENT,具有自动选择的ROWID的行是 保证之前从未使用使用的ROWID 表在同一个数据库中。
这意味着保证与提交的行有关。这意味着未提交的行的ID号不会在"之前使用。 (在这个意义上)在表中。
但是,如果插入因(例如)唯一性而失败 约束,失败的插入尝试的ROWID 可能不是 在后续插入时重用,导致ROWID序列中存在间隙。
留下重用的可能性。