2010-05-25 10 views
11

Me encontré con un problema cuando traté de crear dos columnas TIMESTAMP en mi base de datos. Uno llamado created y otro llamado updated. Pensé que sería fácil establecer el valor predeterminado de ambos en CURRENT_TIMESTAMP y luego ON UPDATE CURRENT_TIMESTAMP para la columna updated. Pero por alguna razón MySQL significa que es una mala idea ... así que he estado buscando formas de hacerlo sin tener que configurar uno de ellos en la consulta de inserción.MySQL: Cómo crear el desencadenante para establecer la fecha de creación de nuevas filas

Encontré una forma mediante el uso de un disparador en this answer, pero sigo recibiendo errores. Yo sólo logró crear realmente el gatillo, pero ahora recibo errores cuando trato de insertar nuevas filas alegando que

1442 - No se puede actualizar la tabla de 'tareas' en función almacenada/gatillo porque esta siendo usado ya declaración que invocó esta función/activador almacenado.

Y no entiendo lo que eso significa en absoluto. Entonces, esperaba que alguien aquí pudiera arrojar algo de luz sobre este tema.

El SQL he utilizado para crear la tabla y el gatillo es el siguiente:

CREATE TABLE `tasks` (
    `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 
    `created` DATETIME, 
    `updated` TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    `title` VARCHAR(255) NOT NULL, 
    `notes` TEXT, 
    `status_id` INT(10) UNSIGNED NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `status_id` (`status_id`), 
    CONSTRAINT `fk_tasks_statuses` FOREIGN KEY (`status_id`) REFERENCES `statuses` (`id`), 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 


CREATE TRIGGER task_creation_timestamp AFTER INSERT ON tasks 
FOR EACH ROW 
UPDATE tasks SET created = updated WHERE id = NEW.id; 

¿Qué estoy haciendo mal aquí?

Respuesta

24

Su gatillo tiene que ser "antes de insertar", y hay que utilizar en lugar de SETUPDATE:

CREATE TRIGGER task_creation_timestamp BEFORE INSERT ON tasks 
FOR EACH ROW 
SET NEW.created = NOW(); 
Cuestiones relacionadas