C++ 和 Sqlite DELETE 查询实际上并没有从数据库文件中删除值

C++ and Sqlite DELETE query doesn`t actually delete the value from the database file

我在 SQlite 和 c++ 上遇到过这个问题,但找不到任何答案。

在 SQlite 和 C++ 中一切正常,所有查询所有输出所有函数,但我有这个问题找不到任何解决方案。

我创建了一个数据库MyTest.db 我创建了一个 table 测试,其中包含一个 id 和一个 name 作为字段 我为每个 id=1 name=Name1 和 id=2 name=Name2 输入 2 个值 我删除第二个值

table 中的数据现在说我只有 id=1 和 name=Name1

当我用 notepad.exe 打开我的 Mytest.db 时,我删除的值(例如 id=2 name=Name2 )仍在数据库文件中,尽管它没有出现在数据中结果 table 但仍然存在。

我想问任何知道这件事的人是这样的: 是否有任何其他方法也必须从数据库文件中删除该值,或者这是我对 SQLITE 的 DELETE 选项的错误(我对此表示怀疑)

这就像数据库文件不断收集其中的所有垃圾,而不从其 table 中删除已删除的值...

非常感谢任何帮助或建议

基本上所有数据库只标记行活动或不活动,它们不会立即从文件中删除实际数据。这将是对时间和资源的巨大浪费,因为文件的那部分可以重复使用。

由于您的查询显示该行在结果中不活跃,这在某种程度上是个问题吗?如果你想回收space,你总是可以在数据库上运行一个VACUUM,但我会让数据库引擎自己处理所有事情。不会的"keep collecting all the trash inside it",别担心。

如果您发现文件越来越大并且 space 没有被重复使用,那么您可以不时地发出 vacuum。

您也可以通过在删除旧行后插入其他行来进行测试。引擎应该在某个时候重用文件的那些部分。

如果您使用 "PRAGMA secure_delete=ON;",则 SQLite 会用零覆盖已删除的内容。参见 https://www.sqlite.org/pragma.html#pragma_secure_delete

即使 secure_delete=OFF,已删除的 space 将在您下次 INSERT 时重新使用(并覆盖)以存储新内容。 SQLite 不会泄漏磁盘 space,也不需要 VACUUM 来回收 space。但通常情况下,删除的内容不会被覆盖,因为它使用额外的 CPU 周期和磁盘 I/O.