Personalmente, me gustaría hacer uso de la MySQL Event Scheduler. Este es un programador de eventos integrado, más bien como CRON en Linux.
Puede especificarlo para llamar a un procedimiento, procedimientos o funciones o ejecutar un poco de SQL a intervalos designados.
Leer la documentación de MySQL, pero un ejemplo sería:
CREATE EVENT mydatabase.myevent
ON SCHEDULE EVERY 1 WEEK STARTS CURRENT_TIMESTAMP + INTERVAL 10 MINUTE
DO
call clean_tables();
Así que esto está diciendo "clean_tables de llamada() una vez a la semana y hacer la primera llamada en 10 minutos en el tiempo"
Uno de gotcha es que el programador de eventos está (creo) deshabilitado por defecto. Para encenderlo de ejecución:
SET GLOBAL event_scheduler = ON;
A continuación, puede ejecutar:
SHOW PROCESSLIST;
para ver si el hilo de eventos planificador está en ejecución.
En cuanto a preservar su columna de ID de tabla A (si es necesario). Yo mantendría la ID en Table_Archive como única en esa tabla, es decir, convertirla en la clave principal & auto_increment y luego tener una columna 'Original_TableA_ID' en la que almacenar la Id. De TableA. Puede poner un índice único sobre esto si lo desea.
Así Table_Archive sería como:
create table `Table_Archive` (
ID int unsigned primary key auto_increment, -- < primary key auto increment
tableAId unsigned int not null, -- < id column from TableA
stringValue varchar(100),
timestamp datetime,
UNIQUE KEY `archiveUidx1` (`tableAId`) -- < maintain uniqueness of TableA.ID column in Archive table
);
Nadie parece haber respondido a su pregunta original "¿Cómo cambio _now sea la fecha hace 3 días?".Usted hace que el uso de INTERVAL
:
DELIMITER $
CREATE PROCEDURE clean_tables()
BEGIN
BEGIN TRANSACTION;
DECLARE _now DATETIME;
SET _now := NOW();
INSERT
INTO Table_Archive
SELECT *
FROM TableA
WHERE timestamp < _now - interval 3 day;
FOR UPDATE;
DELETE
FROM TableA
WHERE timestamp < _now - interval 3 day;
COMMIT;
END$
DELIMITER ;
Un punto final es que usted debe considerar la creación de un índice en la columna de marca de hora en la Tabla A a mejorar el rendimiento de le clean_tables procedimiento().
¿Algo anda mal con un simple 'INSERT' y 'DELETE', ejecutándose bajo un trabajo cron? –
No sé si las identificaciones interferirán en el futuro. Si elimino de TableA y luego hago muchas inserciones, ¿no se volverá a usar la ID? Y el siguiente movimiento intentará insertar una fila con la misma ID – Linqan
Use una [Sequence] (http://www.tutorialspoint.com/mysql/mysql-using-sequences.htm) para los ID y asegura que los ID se no se repetirá – Manoj