【问题标题】:Compress DB by removing unused PRIMARY KEY AUTOINCREMENTAL INTEGER通过删除未使用的 PRIMARY KEY AUTO INCREMENT INTEGER 来压缩 DB
【发布时间】:2015-02-03 22:04:31
【问题描述】:

使用 SQLite3 我得到了下表:

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

Idx 是整数主键自动增量。

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

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

【问题讨论】:

  • 缝隙有什么问题?不,不要弄乱自动增量列。
  • 我正在编写一个可以运行 15 年甚至更长时间的 MCU 设备,所以我必须防止一切随着时间的推移而增加计算量。
  • 有什么要计算的?它是一个整数值。机器不关心它有什么价值。
  • 我在 200mhz 设备上编写 lua,SQLite 接口是一个内部 SDK,它不是很好。对于一些选择性查找,我已经从 1 迭代到最大值,因此将最大值保持在尽可能低的水平对我来说至关重要。我无法更改 SDK。我不想苛刻,我知道对于 SQL 来说这无关紧要,但对于我的软件来说它确实如此,我无法改变它。
  • 很公平。但是你不能只是填补空白,你不应该尝试操纵自动增量机制。

标签: sql sqlite


【解决方案1】:

正如SQLite documentation 所说:

如果一个表包含一个 INTEGER PRIMARY KEY 类型的列,那么 列成为 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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    • 2019-01-12
    相关资源
    最近更新 更多