2010-05-25 5 views
11

Ich stieß auf ein Problem, als ich versuchte, zwei TIMESTAMP-Spalten in meiner Datenbank zu erstellen. Einer rief created und einer rief updated. Ich dachte, es wäre einfach, den Standardwert von beiden auf CURRENT_TIMESTAMP und dann ON UPDATE CURRENT_TIMESTAMP für die Spalte updated zu setzen. Aber aus irgendeinem Grund bedeutet MySQL, dass das eine schlechte Idee ist ... also habe ich nach Wegen gesucht, dies zu tun, ohne eines von ihnen in der Einfüge-Abfrage zu setzen.MySQL: Wie Trigger für Einstellungsdatum für neue Zeilen erstellen

Ich habe einen Weg gefunden, indem Sie einen Trigger in this answer verwenden, aber ich bekomme immer Fehler. Ich habe gerade geschafft, den Trigger zu erstellen, aber jetzt bekomme ich Fehler, wenn ich versuche, neue Zeilen einzufügen, die behaupten, dass

1442 - Tabelle 'Aufgaben' in gespeicherten Funktion/Trigger nicht aktualisieren kann, weil es bereits von verwendet wird Anweisung, die diese gespeicherte Funktion/Trigger aufgerufen hat.

Und ich verstehe nicht, was das überhaupt bedeutet. Also, ich hatte gehofft, dass jemand hier dieses Thema beleuchten könnte.

Die SQL ich verwendet, um die Tabelle zu erstellen, und der Auslöser ist wie folgt: hier falsch

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; 

Was mache ich?

Antwort

24

Ihre Trigger muss "vor Einsatz" sein, und Sie müssen SET verwenden, anstatt UPDATE:

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