2011-10-11 8 views
5

¿Es posible mover filas de 3 días a otra tabla llamada "Table_Archive" automáticamente en mysql por semana?Mover filas de TableA a Table-Archive

tablaA ex:

ID | stringvalue | Timestamp 
1 | abc   | 2011-10-01 
2 | abc2  | 2011-10-02 
3 | abc3  | 2011-10-05 
4 | abc4  | 2011-10-10 
5 | abc5  | 2011-10-11 

Después del movimiento

tablaA:

ID | stringvalue | Timestamp 
4 | abc4  | 2011-10-10 
5 | abc5  | 2011-10-11 

Table_Archive:

ID | stringvalue | Timestamp 
1 | abc   | 2011-10-01 
2 | abc2  | 2011-10-02 
3 | abc3  | 2011-10-05 

Y cuando ingrese una nueva entrada en la tabla A, ¿no habrá problemas con la ID (PK) en el próximo movimiento?

Lo que he conseguido:

CREATE PROCEDURE clean_tables() 
BEGIN 
    BEGIN TRANSACTION; 

    DECLARE _now DATETIME; 
    SET _now := NOW(); 

    INSERT 
    INTO Table_Archive 
    SELECT * 
    FROM TableA 
    WHERE timestamp < _now - 3; 
    FOR UPDATE; 

    DELETE 
    FROM TableA 
    WHERE timestamp < _now - 3; 

    COMMIT; 
END 

¿Cómo cambio _now a ser la fecha hace 3 días?

+0

¿Algo anda mal con un simple 'INSERT' y 'DELETE', ejecutándose bajo un trabajo cron? –

+0

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

+0

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

Respuesta

0

Es posible que necesite echar un vistazo a cron jobs si desea que la secuencia de comandos/consulta se ejecute automáticamente.

Si está utilizando cpanel echar un vistazo en http://www.siteground.com/tutorials/cpanel/cron_jobs.htm

+0

Sí, pensé en la tarea cron, pero me pregunto si también hay algo incorporado en mysql. – Linqan

+1

No, no creo que 'MySQL' pueda automatizar la ejecución de ninguna consulta. Simplemente lo ejecutará cuando sea reenviado. Es necesario que haya alguien/programa/cronjob que envíe la consulta una vez por semana, en su caso. –

+0

Okey, luego uso cron task ... thx – Linqan

10

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().

0

Agregando a la mejor respuesta (imo) de Tom Mac con respecto al programador de eventos: tenga en cuenta que al hacer una copia de seguridad del esquema, debe especificar que desea hacer una copia de seguridad de los eventos mediante el indicador --events = TRUE .

Si está exportando manualmente en el banco de trabajo, la última versión tiene una casilla de verificación en la pestaña principal 'Exportar al disco'; las versiones anteriores lo ocultan en la pestaña Opciones de exportación avanzadas.

Cuestiones relacionadas