【问题标题】:Updating DATETIME with trigger, get error 1442 in MySQL使用触发器更新 DATETIME,在 MySQL 中得到错误 1442
【发布时间】:2023-03-10 07:11:01
【问题描述】:

我在使用 MySQL 中的触发器时遇到问题。我有一个名为“last_modified”的列,我希望在编辑表格时使用当前日期和时间自动更新它。使用触发器,这是我的 SQL 查询:

delimiter //
CREATE TRIGGER trg_update_responders BEFORE UPDATE ON survey_responders
FOR EACH ROW
BEGIN
UPDATE survey_responders
SET NEW.last_modified = CURRENT_DATETIME();
END;//

但是,当我更新表时,例如使用此查询:

UPDATE survey_responders SET first_name = "bob" WHERE id = "1";

MySQL Workbench 显示错误 1442:“无法更新存储函数/触发器中的表 'table_name',因为它已被调用此存储函数/触发器的语句使用”

我已经查看了具有相同错误的类似问题,但仍未修复它。感谢您的帮助。

** 更新 **

这成功了:

delimiter //
CREATE TRIGGER trg_update_responders BEFORE UPDATE ON survey_responders
FOR EACH ROW
BEGIN
SET NEW.last_modified = CURRENT_TIMESTAMP();
END;//

似乎我根本不需要重复

UPDATE survey_responders

并且 CURRENT_DATETIME() 不存在,我必须使用 CURRENT_TIMESTAMP()。

【问题讨论】:

  • 有什么理由不更新更新语句本身的 last_modified 列?
  • 这是作业的一部分;它需要我使用触发器。

标签: mysql triggers mysql-workbench mysql-error-1442


【解决方案1】:

这成功了:

delimiter //
CREATE TRIGGER trg_update_responders BEFORE UPDATE ON survey_responders
FOR EACH ROW
BEGIN
SET NEW.last_modified = CURRENT_TIMESTAMP();
END;//

似乎我根本不需要重复

UPDATE survey_responders

并且 CURRENT_DATETIME() 不存在,我必须使用 CURRENT_TIMESTAMP()。

【讨论】:

    【解决方案2】:

    使用触发器无法实现您尝试执行的操作。

    在存储的函数或触发器中,不允许修改 已被(用于读取或写入)的表 调用函数或触发器的语句。

    Source

    您需要以其他方式执行此操作。

    请看这里:MySQL - Trigger for updating same table after insert

    执行此操作的典型方法是创建一个存储过程,即 插入/更新目标表,然后更新其他行, 全部在一个事务中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-15
      • 2022-12-01
      • 2017-08-12
      • 1970-01-01
      • 1970-01-01
      • 2015-07-09
      • 1970-01-01
      相关资源
      最近更新 更多