【问题标题】:MySQL: How to create trigger for setting creation date for new rowsMySQL:如何创建触发器以设置新行的创建日期
【发布时间】:2010-05-25 17:34:38
【问题描述】:

我尝试在我的数据库中创建两个 TIMESTAMP 列时遇到了问题。一个叫created,一个叫updated。我认为将CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP 的默认值设置为updated 列会很容易。但由于某种原因,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;

我在这里做错了什么?

【问题讨论】:

    标签: mysql sql triggers timestamp mysql-error-1442


    【解决方案1】:

    您的触发器需要在“插入之前”,并且您需要使用SET 而不是UPDATE

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-01
      • 2011-02-03
      • 2016-09-19
      • 2013-04-05
      • 2015-02-23
      • 2014-01-31
      相关资源
      最近更新 更多