2010-05-25 5 views
11

Ho avuto un problema mentre tentavo di creare due colonne TIMESTAMP nel mio database. Uno chiamato created e uno chiamato updated. Ho pensato che sarebbe stato facile impostare il valore predefinito di entrambi su CURRENT_TIMESTAMP e quindi ON UPDATE CURRENT_TIMESTAMP per la colonna updated. Ma per qualche ragione MySQL significa che è una cattiva idea ... quindi ho cercato modi per farlo senza doverne impostare uno nella query di inserimento.MySQL: Come creare un trigger per impostare la data di creazione per nuove righe

Ho trovato un modo utilizzando un trigger in this answer, ma continuo a ricevere errori. Sono appena riuscito a creare il trigger, ma ora ricevo errori quando tento di inserire nuove righe sostenendo che

1442 - Impossibile aggiornare la tabella "attività" nella funzione/trigger memorizzato perché è già utilizzata da dichiarazione che ha invocato questa funzione/trigger memorizzato.

E non capisco cosa significhi. Quindi, speravo che qualcuno qui potesse chiarire questo argomento.

L'SQL che ho usato per creare la tabella e il grilletto è la seguente:

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; 

Che cosa sto facendo male qui?

risposta

24

il trigger ha bisogno di essere "prima di inserimento", ed è necessario utilizzare SET invece di UPDATE:

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