2010-05-25 8 views
5

Estoy usando una base de datos SQLite para almacenar valores de un registrador de datos. El registrador de datos eventualmente llenará todo el espacio disponible en el disco duro de la computadora. Estoy buscando una manera de eliminar el último 25% de los registros de la base de datos una vez que alcanza un cierto límite.SQLite eliminar el último 25% de los registros en una base de datos

usando el siguiente código:

$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)); 

un archivo de diario se crea junto a la base de datos que llena el espacio restante en la unidad hasta que falla el guión.

¿Cómo/Puedo evitar que se cree este archivo de diario? De todos modos para combinar las tres consultas SQL en una declaración?

Respuesta

2

Si el diario es la única causa del problema, puede intentar que SQLite haga su diario en la memoria, o simplemente desactívelo.

De the docs:

PRAGMA journal_mode;
PRAGMA database.journal_mode;
PRAGMA journal_mode = DELETE | TRUNCATE | PERSIST | MEMORIA | OFF
PRAGMA database.journal_mode = ELIMINAR | TRUNCATE | PERSIST | MEMORIA | OFF

Este pragma consulta o establece el modo diario para las bases de datos asociadas con la conexión de la base de datos actual.

Las dos primeras formas de este pragma consultan el modo diario actual. En la primera forma, se devuelve el valor predeterminado de journal_mode. El modo predeterminado de diario es el modo utilizado por las bases de datos agregadas a la conexión mediante declaraciones ADTACH subsiguientes. La segunda forma devuelve el modo diario actual para una base de datos específica.

Las dos últimas formas cambian el modo diario. La cuarta forma cambia el modo diario para una conexión de base de datos específica. Use "main" para la base de datos principal (la base de datos que fue abierta por la llamada de interfaz original sqlite3_open(), sqlite3_open16() o sqlite3_open_v2()) y use "temp" para la base de datos que contiene tablas TEMP. El 3er formulario cambia el modo diario en todas las bases de datos y cambia el modo diario predeterminado que se usará para las nuevas bases de datos agregadas por los siguientes comandos ATTACH. Se devuelve el nuevo modo diario. Si no se pudo cambiar el modo diario, se devuelve el modo diario original.

El modo de diario ELIMINAR es el comportamiento normal. En el modo DELETE, el diario de reversión se elimina al finalizar cada transacción. De hecho, la operación de eliminación es la acción que hace que la transacción se comprometa. (Consulte el documentado titulado Compromiso atómico en SQLite para obtener detalles adicionales).

El modo de diario TRUNCATE confirma las transacciones al truncar el diario de retrotracción a cero en lugar de eliminarlo. En muchos sistemas, truncar un archivo es mucho más rápido que eliminar el archivo, ya que no es necesario cambiar el directorio que lo contiene.

El modo de diario PERSIST evita que el diario de reversión se elimine al final de cada transacción. En cambio, el encabezado del diario se sobrescribe con ceros. Esto evitará que otras conexiones de base de datos hagan retroceder el diario.El modo PERSISTIR en diario es útil como una optimización en plataformas donde la eliminación o truncar un archivo es mucho más caro que sobrescribir el primer bloque de un archivo con ceros.

el modo de memoria de diario almacena la revista de reversión en la memoria RAM volátil. Esto ahorra E/S de disco pero a expensas de la seguridad e integridad de la base de datos. Si la aplicación se bloquea usando SQLite en medio de una transacción cuando se ajusta el modo MEMORIA diario, entonces el archivo de base de datos es muy probable que vaya corrupto.

El modo OFF diario desactiva la revista de deshacer por completo. Nunca se crea un diario de reversión y, por lo tanto, nunca se elimina un diario de reversión. El modo de registro por diario desactivado deshabilita las capacidades de compromiso atómico y retrotracción de SQLite. El comando ROLLBACK ya no funciona; se comporta de una manera indefinida. Las aplicaciones deben evitar usar el comando ROLLBACK cuando el modo diario está desactivado. Si la aplicación se bloquea en el medio de una transacción cuando se establece el modo de registro por diario OFF, entonces el archivo de la base de datos muy probablemente se dañará.

Tenga en cuenta que la journal_mode de una base de datos en memoria es memoria ni OFF y no se puede cambiar a un valor diferente. Se ignora un intento de cambiar el modo journal_mode de una base de datos en memoria a cualquier configuración que no sea MEMORY u OFF. Tenga en cuenta también que journal_mode no se puede cambiar mientras una transacción está activa.

Cuestiones relacionadas