通过删除未使用的PRIMARY KEY AUTO INCREMENT INTEGER来压缩DB

时间:2015-02-03 13:37:32

标签: sql sqlite

使用SQLite3我得到了以下表格:

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

Idx是INTEGER PRIMARY KEY AUTOINCREMENT。

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

我对SQL不是很坚定但是afaik,我需要自动增量来确定行,毫无疑问,其他所有列都可能有双重。

1 个答案:

答案 0 :(得分:2)

正如SQLite documentation所说:

  

如果表包含INTEGER PRIMARY KEY类型的列,那么   column成为ROWID的别名。 [...]使用AUTOINCREMENT,行   自动选择的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>