【问题标题】:C++ and Sqlite DELETE query doesn`t actually delete the value from the database fileC++ 和 Sqlite DELETE 查询实际上并没有从数据库文件中删除值
【发布时间】:2016-02-24 15:42:06
【问题描述】:

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

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

我创建了一个数据库 MyTest.db 我创建了一个带有 id 和名称作为字段的表测试 我为每个 id=1 name=Name1 和 id=2 name=Name2 输入 2 个值 我删除了第二个值

表中的数据现在表明我只有 id=1 和 name=Name1

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

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

它就像数据库文件不断收集其中的所有垃圾而不从其表中删除 DELETED 值...

非常感谢任何帮助或建议

【问题讨论】:

    标签: c++ database sqlite sql-delete


    【解决方案1】:

    如果您使用“PRAGMA secure_delete=ON;”然后 SQLite 用零覆盖已删除的内容。见https://www.sqlite.org/pragma.html#pragma_secure_delete

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

    【讨论】:

    • 谢谢 Richard,这不是一个完美的解决方案,但我可以看到 SQlite 的工作方式只是为了避免额外的 CPU 周期并足够快。
    【解决方案2】:

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

    由于您的查询显示该行在结果中未处于活动状态,这在某种程度上是个问题吗?如果你想回收空间,你总是可以在数据库上运行VACUUM,但我会让数据库引擎自己处理所有事情。它不会“继续收集里面的所有垃圾”,不用担心。

    如果您看到文件大小在增长并且空间没有被重复使用,那么您可以不时发出真空。

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

    【讨论】:

    • 我已经通过一个现成的 c++ 应用程序使用 sqlite 足够长的时间了,我的文件充满了不时删除的垃圾值。它从未从文件中删除这些值,并且对于可能的敏感数据是是个问题,有什么解决办法吗?你说的这个真空是什么?
    • @Nocs 检查它的链接,它会重建数据库并丢弃所有不需要的东西。如果数据库很大,这可能是一项耗时的任务,所以不应该一直运行。但有时它可能会派上用场。对于敏感数据,它将很有用。
    • 我已经阅读了sqlite.org/lang_vacuum.html,这在某种程度上是一个小解决方案,但它是否碰巧理解“VACUUM 仅适用于主数据库。不可能 VACUUM附加的数据库文件。” ??是我的数据库文件是由主数据库的 sqlite 创建的还是附加的?
    • @Nocs 是主数据库。附加数据库通过 ATTACH DATABASE sqlite.org/lang_attach.html 单独加入主数据库
    猜你喜欢
    • 2011-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    • 2014-09-06
    • 1970-01-01
    • 2011-12-19
    相关资源
    最近更新 更多