2011-12-03 14 views
6

Necesito hacer un seguimiento de la hora en que se insertó una fila en la base de datos, y la hora en que se modificó por última vez.Marca de tiempo para la creación de filas y la última modificación

Me trataron de crear dos columnas separadas, y utilizar CURRENT_TIMESTAMP:

create table def (
    id int, 
    creation timestamp 
    default CURRENT_TIMESTAMP, 
    modification timestamp 
    on update CURRENT_TIMESTAMP 
); 

Sin embargo, esto produjo un error:

ERROR 1293 (HY000): Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause

¿Cuál es la mejor manera de hacer esto?

Estoy pensando en el procedimiento almacenado, pero en busca de una solución estándar. También me preocupan los privilegios de acceso, ya que pocos programas/cosas deberían poder tocar las marcas de tiempo como sea posible.


Aunque preferiría las respuestas de MySQL, también se agradecen las soluciones para otros RDBMS.

+0

Creo que la modificación de la marca de tiempo "característica faltante" se ha corregido después de años en una de las versiones más actuales de MySQL. – hakre

Respuesta

3

Ya esta es una limitación limitada en MySQL. Si está revisando una aplicación, puede agregar una llamada de tiempo() para la columna created_at y dejar que la columna updated_at use CURRENT_TIMESTAMP.

$sql = "INSERT INTO my_table SET name = 'Mike', created_at = " . time(); 

me gustaría optar a hacer esto en la columna de la created_at ya que probablemente no será tocado tan a menudo como la columna de la updated_at.

- Editar -

Mejor aún, utilizan MySQL incorporado en now() función. De esta forma, solo debe preocuparse por la zona horaria del servidor mysql, y no por las zonas horarias del servidor de aplicaciones Y el servidor mysql.

$sql = "INSERT INTO my_table SET name = 'Mike', created_at = NOW()"; 
+1

Buen punto acerca de qué columna usar 'CURRENT_TIMESTAMP' en. –

+1

También puede usar el comando 'NOW()' de MySQL si no estoy equivocado. – Kevin

+1

@kevin: Tiene razón, y tbh, AHORA() es la alternativa preferida, de esa manera solo se trata de la zona horaria del servidor mysql, en lugar del servidor que ejecuta el código de la aplicación Y el servidor mysql. –

2

Puede utilizar un disparador. La aplicación también puede establecer el valor, pero si lo hace, será sobrescrito por la base de datos.

delimiter // 
CREATE TRIGGER def_bef_update BEFORE UPDATE ON def FOR EACH ROW BEGIN 
    SET NEW.modification = CURRENT_TIMESTAMP; 
END// 
delimiter ; 

También puede usarlo para verificar los datos y actualizar su fecha de modificación solo si tiene cambios importantes.

Cuestiones relacionadas