创建mysql触发器以在更新行之后更新spesefic列

时间:2018-12-31 12:10:00

标签: mysql triggers

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

error when trigger executed.

2 个答案:

答案 0 :(得分:0)

您的触发器应该是:

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列,您不需要为此触发。

答案 1 :(得分:-2)

您只需修改您的CREATE TABLE声明:

通过为时间戳和/或DateTime列使用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