- 此问题在此处已有答案**:
How to get rid of gaps in rowid numbering after deleting rows?(4个答案)
两个月前关门了。
我在SQL(sqlite3 on cmd)中的表中创建了2行,然后删除了其中的1行。
CREATE TABLE sample1( name TEXT, id INTEGER PRIMARY KEY AUTOINCREMENT);
INSERT INTO sample1 VALUES ('ROY',1);
INSERT INTO sample1(name) VALUES ('RAJ');
DELETE FROM sample1 WHERE id = 2;
后来当我插入另一行时,系统给它的id是3而不是2。
INSERT INTO sample1 VALUES ('AMIE',NULL);
SELECT * FROM sample1;
picture of table
我如何纠正它,使下一个值自动获得正确的id?或者我如何清除sql数据库缓存来解决它?
1条答案
按热度按时间1l5u6lss1#
解决您描述的问题的最简单的修复方法是省略AUTOINCREMENT。
你的测试结果就会如你所愿。
但是,仍然会生成rowid(如果指定了
INTEGER PRIMARY KEY
,则id列是其别名,无论是否指定了AUTOINCREMENT
),并且可能比现有的最高id(rowid的别名)大1。使用和不使用AUTOINCREMENT之间有细微的区别。
AUTOINCREMENT
,则rowid的生成值及其别名将是表的最高现有rowid加1(但不能绝对保证)。AUTOINCREMENT
,生成的值将是1加上以下两者中的较高者:-在您的示例中,由于使用了2,因此即使删除了2,2 + 1 = 3。
使用AUTOINCREMENT是低效的,因为要知道上次使用的值是什么,需要一个系统表sqlite_sequence,并且要访问该表以存储最新的id并检索该id。
在SQLite AUTOINCREMENT documentation中,这样写道:
AUTOINCREMENT关键字会增加额外的CPU、内存、磁盘空间和磁盘I/O开销,如果不是严格需要,应该避免使用。通常不需要使用该关键字。
还有其他不同之处,例如使用AUTOINCREMENT时,如果已达到ID 9223372036854775807,则再次插入将导致SQLITE_FULL错误。而如果没有
AUTOINCREMENT
,则会出现未使用的ID(由于当前存储设备无法容纳该数量的行,因此会有一个ID)。ORDER BY
子句)进行了特别排序。AUTOINCREMENT
,仍可能导致顺序/序列问题,例如,删除ID为1而不是2的行,则最终将得到ID为2和3的行。也许考虑以下内容,它显示了a)您提出的有限问题如何在没有
AUTOINCREMENT
的情况下得到解决,以及b)如果删除的不是最高的id,它就不是解决方案:-