一尘不染

MySQL:如何创建触发器以设置新行的创建日期

sql

尝试在数据库中创建两个TIMESTAMP列时遇到问题。一个叫created,一个叫updated。我想这会很容易两者的默认值设置为CURRENT_TIMESTAMP,然后ON UPDATE CURRENT_TIMESTAMPupdated列。但是由于某种原因,MySQL意味着这是一个坏主意……因此,我一直在寻找无需在插入查询中设置其中一种方法的方法。

我在此答案中找到了通过使用触发器的一种方法,但我不断遇到错误。我只是设法实际创建了触发器,但是现在当我尝试插入新行时声称出现该错误,这是错误的

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;

我在这里做错了什么?


阅读 201

收藏
2021-03-17

共1个答案

一尘不染

您的触发器必须在“插入之前”,并且您需要使用SET来代替UPDATE

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