mysql - 创建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 ;
解决方案
你的触发器应该是:
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 列,您不需要为此触发。
推荐阅读
- javascript - 使用javascript输入后隐藏文本
- elasticsearch - 如何在 Golang 中将数组传递给 Elasticsearch 的 NewTermsQuery?
- ios - 在子视图中添加 UIImage 并添加约束 - 图像不会调整大小
- java - 在游戏框架中限制登录尝试 3 次
- r - R - 通过光栅图像(迷宫)找到成本最低的路径?
- haskell - 内联派生类型类方法
- android - 我怎样才能让多边形看相机(OpenGL)?
- ckeditor - 字体名称和大小下拉列表中的 CKEditor(默认)项
- c# - C# 按下按钮时显示文本(包括文本框中的文本)
- laravel - 如果我不在 Laravel 中设置外键约束,会发生什么不好的事情吗?