2011-03-11 11 views
5

Tengo un script PHP que importa secuencias de comandos sql en una base de datos MySQL 5. Cada script contiene nada más que UPDATE declaraciones que cada actualización 1 fila en una tabla (MyISAM).Actualizar la marca de tiempo de MySQL incluso si los datos de la fila no han cambiado

Si una fila no ha estado dentro de uno de estos scripts durante 2 días, debe eliminarse. La tabla tiene una columna de marca de tiempo. Sin embargo, cuando la instrucción UPDATE no cambia ninguna columna, la marca de tiempo no se actualiza y no tengo forma de saber si la fila estaba en el archivo de importación o no. ¿Hay alguna manera de forzar esta actualización de la marca de tiempo, incluso si no hay cambios en los datos?

EDITAR: Otra aclaración.

Los archivos de importación son archivos comprimidos que contienen aproximadamente 450,000 filas, cada fila es 1 instrucción UPDATE.

Aquí está la función PHP que maneja los archivos de importación:

private function ImportFile($filename) { 
    $importfile = gzopen($filename, "r"); 
    if (!$importfile) { 
     throw new Exception("Could not open Gzip file " . $filename); 
    } 

    while (!gzeof($importfile)) { 
     $line = gzgets($importfile, 4096); 
     if (!$line) { 
      throw new Exception("Error reading line number $line Gzip file $filename"); 
     } 

     if (strlen(trim($line)) > 0) { 
      $this->DB->Query($line); 
     } 
    } 

    gzclose($importfile); 
} 
+0

Hola, realmente no entiendo tu problema, ¿puedes aclararlo con algún código, una muestra de los archivos de ACTUALIZACIÓN o algo así? – SubniC

Respuesta

9

Simplemente podría tener una actualización para todos los campos que, cuando no se actualiza, por ejemplo:

UPDATE mytable SET timestamp=NOW() WHERE id IN (1, 5, 6, ...); 
+0

La mayoría de estos archivos de importación actualizan alrededor de 450,000 filas, y tendría que analizar cada declaración de actualización para obtener la clave primaria. Esperaba que hubiera una manera más fácil. – klennepette

+0

No sé si puede editar sus scripts, pero podría forzar a cada instrucción UPDATE a tener un SET timestamp = NOW(). –

+0

Es algo en lo que pensar, la aplicación que crea los scripts es una aplicación antigua de Powerbuilder 9. Si hacemos el cambio allí, tendríamos que implementar eso para nuestros clientes. Pero tal vez pueda usar eso en el script PHP, agréguelo a cada línea a medida que pasa. Si recurro a eso, marcaré esta respuesta como aceptada – klennepette

3

http://dev.mysql.com/doc/refman/5.0/en/timestamp-initialization.html

Similar a usar NOW(): siempre que una columna TIMESTAMP no permita valores NULL, puede forzarla a actualizar estableciendo esa columna en NULL.

UPDATE mytable SET timestamp=NULL 
+0

Sí, veo que [los documentos de MySQL sugieren] (http://dev.mysql.com/doc/refman/5.7/en/timestamp-initialization.html), "puede inicializar o actualizar cualquier columna TIMESTAMP a la fecha actual y tiempo al asignarle un valor NULL, a menos que se haya definido con el atributo NULL para permitir valores NULL ". –

Cuestiones relacionadas