通过删除未使用的主键自动增量整数来压缩数据库



使用SQLite3,我得到了下表:

| Idx |  Foo  |   Bar   |
|-----|-------|---------|
|  1  |  It's |something|
|  2  |  and  |  even   |
|  5  |  more |wildcard |

Idx 是整数主键自动增量。

如您所见,Idx 3 和 4 未使用,因为它们已被删除。我可以让这些 Idx 再次可用吗?

我对SQL不是很坚定,但是afaik,我需要自动增量来识别行,毫无疑问,每隔一列都可以有双峰。

如SQLite文档中所述:

如果表包含整数主键类型的列,则 列成为 ROWID 的别名。[...]使用自动增量,行 使用自动选择的 ROWID 保证具有 ROWID 以前从未被同一数据库中的同一表使用过。 并且自动生成的 ROWID 保证 单调递增

所以你的问题是"我可以让这些 Idx 再次可用吗?答案是:是的,但只是明确地,请参阅:

sqlite> create table testtable(idx INTEGER PRIMARY KEY AUTOINCREMENT, foo varchar(100), bar varchar(100));
sqlite> insert into testtable (foo, bar) values ('a', 'b');
sqlite> insert into testtable (foo, bar) values ('c', 'd');
sqlite> insert into testtable (foo, bar) values ('e', 'd');
sqlite> insert into testtable (foo, bar) values ('g', 'g');
sqlite> select * from testtable;
1|a|b
2|c|d
3|e|d
4|g|g
sqlite> delete from testtable where idx = 2;
sqlite> select * from testtable;
1|a|b
3|e|d
4|g|g
sqlite> insert into testtable (foo, bar) values ('h', 'i');
sqlite> select * from testtable;
1|a|b
3|e|d
4|g|g
5|h|i
sqlite> insert into testtable (idx, foo, bar) values (2, 'j', 'k');
sqlite> select * from testtable;
1|a|b
2|j|k
3|e|d
4|g|g
5|h|i
sqlite>

最新更新