2010-05-25 37 views
11

我试图在数据库中创建两个TIMESTAMP列时遇到了问题。一个叫做created,另一个叫updated。我认为可以很容易地将0123和S6106配置为CURRENT_TIMESTAMP,然后ON UPDATE CURRENT_TIMESTAMPupdated列的默认值。但由于某种原因MySQL意味着这是一个坏主意......所以我一直在寻找方法来做到这一点,而不必在插入查询中设置其中的一个。MySQL:如何创建设置新行的创建日期的触发器

我在this answer中找到了一个使用触发器的方法,但我不断收到错误。我好不容易才实际创建触发器,但现在我得到的错误,当我尝试插入新行声称

1442 - 无法更新存储功能表“任务” /触发器,因为它已经使用声明调用这个存储的函数/触发器。

我并没有明白这意味着什么。所以,我希望这里有人能够阐明这个问题。

我用来创建表和触发器是如下的SQL:

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; 

我在做什么错在这里?

回答

24

你触发需要“插入之前”是的,你需要使用SET,而不是UPDATE

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