在更新行之后创建mysql触发器来更新特定列

h9a6wy2h  于 2021-06-17  发布在  Mysql
关注(0)|答案(2)|浏览(422)

我想在一行中发生任何更改后更新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 ;

yrefmtwq

yrefmtwq1#

你的触发器应该是:

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 ;

所以基本上,您应该在触发器之前而不是之后触发它,并且不需要在触发器中创建这个更新指令。相反,只需修改 server_modified_at 更新行之前
请注意,如果目的是在修改记录时存储时间戳,则可以在表中创建如下列:

server_modified_at TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP

当行被更新时,mysql会自动将当前时间戳设置为服务器的\u modified \u at列,您不需要为此设置触发器。

2g32fytz

2g32fytz2#

你应该简单地修改你的 CREATE TABLE -声明:
你所需要的可以通过使用 ON UPDATE 对于时间戳和/或日期时间列:

CREATE TABLE t1 (
  some columns,
  lastModified_ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  lastModified dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

字段将设置为 NOW() 每次修改行时( ON UPDATE )或创建( DEFAULT ).
https://dev.mysql.com/doc/refman/8.0/en/timestamp-initialization.html

相关问题