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

Svi*_*ish 12 mysql sql triggers timestamp mysql-error-1442

我试图在我的数据库中创建两个TIMESTAMP列时遇到了问题.一个叫created,一个叫updated.我认为很容易将两者的默认值设置为CURRENT_TIMESTAMP然后ON UPDATE CURRENT_TIMESTAMPupdated列.但由于某些原因,MySQL意味着这是一个坏主意...所以我一直在寻找方法来做到这一点,而无需在插入查询中设置其中一个.

我在这个答案中通过使用触发器找到了一种方法,但我一直在收到错误.我只是设法实际创建了触发器,但是当我尝试插入声称具有该功能的新行时,我现在遇到错误

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;
Run Code Online (Sandbox Code Playgroud)

我在这做错了什么?

Ike*_*ker 27

你的触发器需要"插入前",你需要使用SET而不是UPDATE:

CREATE TRIGGER task_creation_timestamp BEFORE INSERT ON tasks 
FOR EACH ROW
SET NEW.created = NOW();
Run Code Online (Sandbox Code Playgroud)