首页 > 解决方案 > 创建mysql触发器以在更新行后更新特定列

问题描述

我想在连续发生任何更改后更新 MySQL 中的特定列。我使用下面的查询来创建触发器,但是当更改记录数据时,发生了错误。

触发查询:

DELIMITER $$
CREATE TRIGGER after_user_update AFTER UPDATE ON group_chat_message
FOR EACH ROW
BEGIN 
   UPDATE `group_chat_message` SET 
   `server_modified_at` = CONCAT(SUBSTRING(REPLACE(NOW(), '-', ''),1,8),SUBSTRING(REPLACE(NOW(), ':', ''),12,8))
    WHERE id = NEW.id
    ;
END;$$
DELIMITER ;

触发器执行时出错。

标签: mysqltriggers

解决方案


你的触发器应该是:

DELIMITER $$
CREATE TRIGGER after_user_update BEFORE UPDATE ON group_chat_message
FOR EACH ROW
BEGIN 
   SET NEW.`server_modified_at` = CONCAT(SUBSTRING(REPLACE(NOW(), '-', ''),1,8),SUBSTRING(REPLACE(NOW(), ':', ''),12,8));
END;$$
DELIMITER ;

所以基本上,你应该在之前而不是之后触发它,你不需要在触发器中创建这个 UPDATE 指令。server_modified_at相反,只需在更新行之前修改 NEW 值


请注意,如果目的是在修改记录时存储时间戳,您可以在表中创建这样的列:

server_modified_at TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP

并且 MySQL 会在行更新时自动将当前时间戳设置为您的 server_modified_at 列,您不需要为此触发。


推荐阅读