尝试在数据库中创建两个TIMESTAMP列时遇到问题。一个叫created,一个叫updated。我想这会很容易两者的默认值设置为CURRENT_TIMESTAMP,然后ON UPDATE CURRENT_TIMESTAMP在updated列。但是由于某种原因,MySQL意味着这是一个坏主意……因此,我一直在寻找无需在插入查询中设置其中一种方法的方法。
created
updated
CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP
我在此答案中找到了通过使用触发器的一种方法,但我不断遇到错误。我只是设法实际创建了触发器,但是现在当我尝试插入新行时声称出现该错误,这是错误的
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;
我在这里做错了什么?
您的触发器必须在“插入之前”,并且您需要使用SET来代替UPDATE:
SET
UPDATE
CREATE TRIGGER task_creation_timestamp BEFORE INSERT ON tasks FOR EACH ROW SET NEW.created = NOW();