SQLite删除数据库中最后25%的记录

时间:2010-05-25 22:37:28

标签: sql sqlite

我正在使用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查询合并到一个语句中?

1 个答案:

答案 0 :(得分:2)

如果期刊是问题的唯一原因,您可以尝试让SQLite在内存中记录日记,或者只是将其关闭。

来自the docs

  

PRAGMA journal_mode;
   PRAGMA database.journal_mode;
   PRAGMA journal_mode = DELETE | TRUNCATE | PERSIST |记忆|关闭
   PRAGMA database.journal_mode = DELETE | TRUNCATE | PERSIST |记忆|关闭

     

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

     

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

     

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

     

DELETE日记记录模式是正常行为。在DELETE模式下,在每个事务结束时删除回滚日志。实际上,删除操作是导致事务提交的操作。 (有关其他详细信息,请参阅SQLite中标题为Atomic Commit的文档。)

     

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。