2010-08-15 36 views
9

Estoy creando algunas tablas en las que quiero guardar la hora en que se creó un registro y cuándo se actualizó por última vez. Pensé que podría tener dos campos de marca de tiempo donde uno tendría el valor CURRENT_TIMESTAMP y el otro tendría CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP. Pero supongo que no puedo hacer esto porque solo puedes tener 1 campo de marca de tiempo con un valor predeterminado en una tabla.MySQL create time y update time timestamp

¿Cómo recomendarías que obtuviera y almacenara las dos veces? ¡Gracias!

Respuesta

8

Puede tener dos columnas de tipo fecha y hora en una tabla.

las siguientes obras para MySQL 5,0

 
create table t 
(
    id integer, 
    created_at timestamp default current_timestamp, 
    updated_at timestamp 
); 

Creo que está confundiendo esto con SQL Server (donde marca de tiempo no es realmente un "sello de tiempo" y de hecho existe un límite en una sola columna "marca de tiempo")

Editar: Pero necesitará un activador para actualizar la columna update_at cada vez que se cambie la fila.

+0

Eso es correcto, la marca de tiempo de SQL Server es realmente solo un sinónimo de rowversion – SQLMenace

+0

Esto se ejecutaría, pero el campo updated_at no se actualiza automáticamente en el cambio. Pensé que agregar ON UPDATE CURRENT_TIMESTAMP en la columna updated_at se encargaría de eso. Es entonces cuando se queja de que esto no se puede hacer. – Aishwar

+0

Sí, como dije: necesita utilizar un activador para rellenar la columna updated_at –

2

Por lo que sé, no hay solución para esa restricción. Necesitará establecer manualmente (al menos) una de las marcas de tiempo, la manera más fácil es simplemente agregar updated = NOW() al UPDATE -query.

+0

1 Eso parece como una solución viable. Me hubiera encantado, si el servidor pudiera hacerlo automáticamente :) – Aishwar

+0

Sin embargo, podría ser posible con desencadenantes, pero creo que no es una gran solución. –

+0

Normalmente se hace al revés: especifica manualmente 'created = NOW()' y 'updated' se establece automáticamente.El motivo es que crea un registro 1 vez, pero las actualizaciones pueden ser ilimitadas. – Stalinko

0

Necesitará dos columnas: CREATE_TIME y UPDATE_TIME.

Es posible que desee agregar CREATE_USER y UPDATE_USER.

Quizás desee tener una relación 1: muchos con el nombre de la columna modificada, valores antiguos y nuevos.

Todo es parte de la captura de datos modificados. Podría tener tablas de CDC que se actualicen mediante desencadenadores.

+0

Tengo 2 columnas para almacenar crear hora y actualizar la hora, pero no puedo establecer los dos valores predeterminados que indiqué anteriormente. Voy a ver qué es CDC. ¿No debería haber una solución simple para esto? Imaginaría que este es un escenario común. – Aishwar

+0

Es común, pero no creo que MySQL tenga una solución integrada para ello. Oracle y SQL Server sí. No debería ser difícil de hacer: algunas tablas y factores desencadenantes. – duffymo

0

Dejaría la marca de tiempo actual de la forma en que sugirió y complete el campo created_at con la fecha actual en la inserción.

14

Una buena manera de crear campos como 'creada' y 'actualizada' es

CREATE TABLE `mytable` ( 
`id` INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, 
`created` TIMESTAMP DEFAULT '0000-00-00 00:00:00', 
`updated` TIMESTAMP DEFAULT now() ON UPDATE now(), 
`myfield` VARCHAR(255) 
); 

Y es necesario introducir valores nulos en ambas columnas en "insertar":

INSERT INTO mytable (created,updated,myfield) VALUES (null,null,'blablabla'); 

Y ahora, en todas las actualizaciones, el campo 'actualizado' tendrá un nuevo valor con la fecha real.

UPDATE mytable SET myfield='blablablablu' WHERE myfield='blablabla'; 

Fuente: http://gusiev.com/2009/04/update-and-create-timestamps-with-mysql/

+2

Esta es la mejor solución que he encontrado. La magia es que NULL se traduce a NOW() en el inserto. En una aplicación típica, habrá más formas de actualizar una fila que de crearla, por lo que se siente como menos mantenimiento que usar su "uno ahora" en la creación y el manejo manual de las actualizaciones, usando un desencadenador separado u otro enfoque. – botimer

+1

¡Funcionó maravillosamente! Aunque en mi situación no parecía necesitar pasar los valores nulos y solo la columna actualizada cambió. Parece que funciona bien. 'created_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP EN ACTUALIZACIÓN CURRENT_TIMESTAMP,' ... – Jordan

7

En MySQL versión 5.6.5 Para ello, puede utilizar DEFAULT y ON UPDATE. No se necesitan desencadenantes.

ts_create TIMESTAMP CURRENT_TIMESTAMP DEFAULT, ts_update DEFAULT TIMESTAMP CURRENT_TIMESTAMP DE ACTUALIZACIÓN CURRENT_TIMESTAMP

+0

¡Ahora esta es la mejor respuesta! – v010dya