2010-05-25 88 views
5

我正在使用SQLite数据库来存储来自数据记录器的值。数据记录器最终将填满计算机上所有可用的硬盘空间。我正在寻找一种方法,一旦达到某个限制,就会从数据库中删除最后25%的日志。SQLite删除数据库中最后25%的记录

使用下面的代码:

$ret = Query('SELECT id as last FROM data ORDER BY id desc LIMIT 1 ;'); 
$last_id = $ret[0]['last'] ; 
$ret = Query('SELECT count(*) as total FROM data'); 
$start_id = $last_id - $ret[0]['total'] * 0.75 ; 
Query('DELETE FROM data WHERE id < '. round($start_id, 0)); 

一个日志文件被旁边,直到脚本失败,填补了硬盘上的剩余空间数据库中创建。

如何/我可以停止创建此日志文件? 无论如何将所有三个SQL查询合并到一个语句中?

回答

2

如果日志是问题的唯一原因,那么可以尝试让SQLite在内存中执行日志记录,或者关闭它。

the docs

PRAGMA journal_mode;
PRAGMA database.journal_mode;
PRAGMA journal_mode = DELETE | TRUNCATE | PERSIST | MEMORY | OFF
PRAGMA database.journal_mode = DELETE | TRUNCATE | PERSIST | MEMORY | OFF

此编译指示查询或设置与当前数据库连接关联的数据库的日志模式。

该编译指示的前两种形式查询当前日志模式。在第一种形式中,返回默认的journal_mode。默认日志记录模式是由后续ATTACH语句添加到连接的数据库使用的模式。第二种形式返回特定数据库的当前日记模式。

最后两种形式更改日记模式。第四种形式更改特定数据库连接的日志记录模式。对主数据库(由原始的sqlite3_open(),sqlite3_open16()或sqlite3_open_v2()接口调用打开的数据库)使用“main”,并将“temp”用于包含TEMP表的数据库。第三种形式更改所有数据库的日志模式,并更改将用于后续ATTACH命令添加的新数据库的默认日志记录模式。新的日记模式返回。如果日记模式无法更改,则返回原始日记模式。

DELETE日志记录模式是正常行为。在DELETE模式下,回滚日志在每个事务结束时被删除。事实上,删除操作是导致事务提交的操作。 (请参阅标题为“Atomic Commit In SQLite”的文档以获取更多详细信息。)

TRUNCATE日记记录模式通过将回滚日志截断为零而不是删除它来提交事务。在很多系统上,截断文件比删除文件要快得多,因为包含的目录不需要改变。

PERSIST日记模式可防止在每次事务结束时删除回滚日志。相反,日志的标题被零覆盖。这将阻止其他数据库连接将日记回滚。PERSIST日志模式在平台上的优化很有用,删除或截断文件比用零覆盖文件的第一个块要昂贵得多。

MEMORY日志记录模式将回滚日志存储在易失性RAM中。这节省了磁盘I/O,但是牺牲了数据库的安全性和完整性。如果在设置MEMORY日志记录模式时使用SQLite的应用程序在事务中间崩溃,那么数据库文件很可能会损坏。

OFF日志模式完全禁用回滚日志。没有创建回滚日志,因此永远不会有回滚日志来删除。 OFF日志模式禁用SQLite的原子提交和回滚功能。 ROLLBACK命令不再起作用;它的行为不确定。日志模式为OFF时,应用程序必须避免使用ROLLBACK命令。如果应用程序在OFF日志模式设置时在事务中间崩溃,那么数据库文件很可能会损坏。

请注意,内存数据库的journal_mode是MEMORY或OFF,不能更改为不同的值。尝试将内存数据库的journal_mode更改为除MEMORY或OFF之外的任何设置都将被忽略。还要注意,事务处于活动状态时,journal_mode无法更改。