【问题标题】:MySQL Trigger updateMySQL 触发器更新
【发布时间】:2015-01-17 19:31:09
【问题描述】:

我想创建一个触发器,将修改行的 last_modified 列更新为当前时间。这是我想出的,但是当我在创建触发器后尝试更新一行时,它不会让我这样做。

delimiter $$
create trigger survey_responder_modified
after update on survey_responders
for each row
begin
    update survey_responders
    set last_modified = now();
end
$$

【问题讨论】:

    标签: mysql sql tsql triggers


    【解决方案1】:

    你可以试试这个示例触发器代码

    用于在新插入行的 data_create 列中添加当前日期

    CREATE TRIGGER trigger_DatetimeInsert BEFORE INSERT ON tableName FOR EACH ROW 
    BEGIN
        SET NEW.date_create = NOW();
    END; 
    

    用于在新修改行的 data_modify 列中添加当前日期

    CREATE TRIGGER trigger_DatetimeModify BEFORE UPDATE ON tableName FOR EACH ROW 
    BEGIN
        SET NEW.date_modify = NOW();
    END;
    

    【讨论】:

      【解决方案2】:

      在我看来,这可能会导致无限倒退。换句话说,在通过更新表触发的触发器中,您再次更新表,导致触发器被触发,...

      现在 MySQL 可能足够聪明,可以防止这种情况发生,但我不会打赌,尤其是当有更简单的方法时。

      这种功能最好作为 before 触发器而不是 after 触发器来完成。这样,您就可以在数据进入表之前设置列。

      大致如下:

      create trigger survey_responder_inserting
          before insert on survey_responders
          for each row set new.last_modified = now();
      create trigger survey_responder_updating
          before update on survey_responders
          for each row set new.last_modified = now();
      

      请注意,通常涉及两个触发器,一个用于插入,一个用于更新。在您的情况下,它们都做同样的事情,因为您似乎只有一个“最后更新”列,但如果需要,您可以使用创建和更新列。

      【讨论】:

      • 我尝试将其更改为之前,但它仍然不允许我在触发器创建后更新表。我收到错误错误代码:1442。无法更新存储函数/触发器中的表“survey_responders”,因为它已被调用此存储函数/触发器的语句使用。
      • 当我尝试你的代码时,它给了我另一个错误,说 Unknown system variable 'last_modified'
      • @Dusster,为此道歉,“新”说明符左侧,现已修复。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多