¿Activar para ACTUALIZAR después de ACTUALIZAR?

13

Quiero hacer un disparador para registrar el tiempo de cualquier actualización como:

CREATE TRIGGER col_update
AFTER UPDATE ON col
FOR EACH ROW BEGIN
UPDATE col SET updated=NOW() WHERE id=NEW.id; // or OLD.id
END

El problema es que cuando este disparador intenta actualizar el updated columna, también es otro evento de actualización, que ejecuta el activador. Esto creará un bucle infinito, que no funciona.

¿Cómo puedo almacenar el tiempo de actualización en la columna correspondiente?

Deseo usar un disparador porque hay muchas columnas en la tabla. Si intento configurar el tiempo de actualización manualmente, necesitaría modificar muchas consultas.

Googlebot
fuente

Respuestas:

17

Utilice un BEFOREdisparador en su lugar y configure la updatedcolumna asignando un valor a NEW.updated(esta sería una asignación simple, no un UPDATE). De esta manera no activará UPDATEs adicionales .

Su cuerpo disparador simplemente se verá como

SET NEW.updated = NOW()

Por lo general, uso AFTERdesencadenantes solo para modificar otras tablas, BEFOREpara modificar la fila nueva (o actualizada) o suprimir DELETE.

dezso
fuente
1

Si, como en su caso, desea cambiar el campo actualizado cada vez que se ha cambiado el registro, no necesita un activador.

Puede usar la inicialización / actualización automática de MySQL de esta manera:

ALTER TABLE `yourtabelname` ADD `updated` DATETIME on update CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP

O en el momento de la creación de la tabla, desde los documentos :

CREATE TABLE t1 (
  ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
Tobias Beuving
fuente