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