在MySQL 5.7.29中创建触发器,在更改的行上设置时间戳

在MySQL 5.7.29中创建触发器,在更改的行上设置时间戳,mysql,Mysql,已经尝试搜索网络和本论坛,以找到解决方案。 我们有一个系统,有一个数据库、许多表和一个不存在的文档 我想在每个表中添加一个列,当行发生更改时,它会自动设置时间戳 我的SQL不是很好,我无法解决这个问题。我不断地遇到语法错误。 我在stackoverflow上找到了一个解决方案,它可以在一个新表中实现这一点,我尝试了这个方法,但是隐藏了一个语法错误,即new.id不存在 有人有什么好主意吗 这就是我最后得到的结果: DELIMITER $$ CREATE TRIGGER logInsert AFT

已经尝试搜索网络和本论坛,以找到解决方案。 我们有一个系统,有一个数据库、许多表和一个不存在的文档

我想在每个表中添加一个列,当行发生更改时,它会自动设置时间戳

我的SQL不是很好,我无法解决这个问题。我不断地遇到语法错误。 我在stackoverflow上找到了一个解决方案,它可以在一个新表中实现这一点,我尝试了这个方法,但是隐藏了一个语法错误,即new.id不存在

有人有什么好主意吗

这就是我最后得到的结果:

DELIMITER $$
CREATE TRIGGER logInsert AFTER INSERT ON test_table
    FOR EACH ROW
    BEGIN
      INSERT INTO datalog (action, id, timestamp, data1, data2)
      VALUES ('insert', NEW.id, NOW(), NEW.data1, NEW.data2);
    END$$
DELIMITER ;

您的触发器在my MySQL 5.7中工作正常(时间戳列名周围有倒勾):

=>


根据您的触发代码,test_表应该有id、data1和data2列。

用示例so fare更新了问题,我想记录的不是列更改,而是在新的行中设置时间戳的行更改coloumn@Jonas对不起,我不明白你想要什么。我已经更新了答案。时间戳是用于数据类型的保留字。如果命名了列timestamp,则必须在查询中使用backsticks来标记timestamp列名。除此之外,您的查询看起来不错(如果数据日志表存在)。
DROP TABLE IF EXISTS datalog;
DROP TABLE IF EXISTS test_table;

CREATE TABLE datalog (
    `action` VARCHAR(50) NULL,
    id INT(11) NULL,
    `timestamp` TIMESTAMP NULL,
    data1 INT(11) NULL,
    data2 INT(11) NULL
);

CREATE TABLE test_table (
    id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    data1 INT(11) NOT NULL,
    data2 INT(11) NOT NULL
);


DELIMITER $$
CREATE TRIGGER logInsert AFTER INSERT ON test_table FOR EACH ROW BEGIN
      INSERT INTO datalog (action, id, `timestamp`, data1, data2)
      VALUES ('insert', NEW.id, NOW(), NEW.data1, NEW.data2);
END$$

DELIMITER ;

INSERT INTO test_table (data1, data2) VALUES (2, 3), (3, 4);

SELECT * FROM datalog;
action  id  timestamp   data1   data2
insert  1   2020-01-31 07:21:09 2   3
insert  2   2020-01-31 07:21:09 3   4