我遇到了一个问题,因为我试图在我的数据库中创建两个TIMESTAMP列。一个叫created
,一个叫updated
。我认为很容易为CURRENT_TIMESTAMP
列设置ON UPDATE CURRENT_TIMESTAMP
和updated
的默认值。但由于某些原因,MySQL意味着这是一个坏主意......所以我一直在寻找方法来做到这一点,而无需在插入查询中设置其中一个。
我在this answer中使用触发器找到了一种方法,但我一直都会遇到错误。我只是设法实际创建了触发器,但是当我尝试插入声称
的新行时,我现在遇到错误1442 - 无法更新存储函数/触发器中的表'tasks',因为它已被调用此存储函数/触发器的语句使用。
我根本没有得到这意味着什么。所以,我希望有人能在这个问题上有所启发。
我用来创建表的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;
我在这里做错了什么?
答案 0 :(得分:27)
您的触发器必须是“插入前”,您需要使用SET
代替UPDATE
:
CREATE TRIGGER task_creation_timestamp BEFORE INSERT ON tasks
FOR EACH ROW
SET NEW.created = NOW();