在执行“DELETE FROM table”之后改变SQLite文件大小

99

我正在使用sqlite3文件。

首先,我打开了一个相对较大的数据库,文件大小约为100 MB。

接着我进行了一些操作。

$db->exec("DELETE FROM table");

我只输入了数据库的一小部分,但文件大小仍然是100MB。

当删除SQLite数据库内容时,您应该怎么做才能改变它的文件大小?

3个回答

154
您要查找的命令是 vacuum。还有一个pragma可开启自动清理空间功能。
根据文档:
当从数据库中删除对象(表、索引、触发器或视图)时,它会留下空间。下次向数据库添加新信息时,将重用此空间。但在此期间,数据库文件可能比必要的大。而且,频繁的插入、更新和删除可能导致数据库中的信息变得分散——分布在整个数据库文件中,而不是聚集在一起。
VACUUM命令通过将主数据库的内容复制到临时数据库文件并重新加载原始数据库文件来清理主数据库。这消除了空闲页面,使表数据连续,并清理了数据库文件结构。

4
能否恢复尚未被覆盖的已删除表格行? - phil294
3
对数据库进行 VACUUM 操作需要使用内部/外部存储器的 两倍 原始数据库文件大小。阅读SQLite查询语言:VACUUM以了解更多信息。 - Roshana Pitigala
@phil294,你最好的选择是将.db文件加载到文本编辑器中并查找你想要的内容。如果你真的想深入了解这里的细节,有一整本关于SQLite数据库取证分析的书籍。 - Andrew Brēza

67

你可以做到这件事

$db->exec("DELETE FROM table");
$db->exec("vacuum");

文件大小将被更改。


-2

清理数据库 SQLite 有两个用于清理的命令——reindex 和 vacuum。

reindex 用于重建索引。它有两种形式:

reindex collation_name;
reindex table_name|index_name;

空值的形式为:

VACUUM;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接