我有一个包含大约50K产品记录的数据库。其中一个名为price的字段,在某些情况下来自50K记录,该字段的值为0(int)。
首先,我运行一个查询,看看有多少行存在价格0,我得到4K左右,所以我想删除它们。
所以我运行以下代码来删除price = 0
的所有记录my $dbh = DBI->connect("dbi:SQLite:MainDatabase.db", "", "", {RaiseError => 1, AutoCommit => 1});
$dbh->do("DELETE FROM products WHERE price =0");
我注意到我的数据库文件大小没有改变所以因为我没有任何错误,我再次运行计数查询以查看是否有任何产品的价格= 0
结果为0表示删除记录。
但是,如果我用一些SQLITE浏览器(比如mozilla的浏览器)打开数据库,那么price = 0的所有记录仍然存在,我可以选择它们。
但是,我无法使用perl选择它们。对于perl,这些记录根本不存在。
有人会对此行为有解释吗?
答案 0 :(得分:2)
数据库不会因为删除某些记录而减小文件大小。他们保存了这个空间,以便将来可以插入新记录。在删除某些行时重构整个数据库只是为了节省几千字节,效率非常低。
有一些方法可以让数据库重新格式化以节省空间,但是你需要担心这一点,这是值得怀疑的。