我有一个名为table的表:

id    int(11)      AI    PK
name  varchar(255)


我将日志存储在table_log

id     int(11)    AI    PK
action enum('insert', 'update', 'delete')
name   varchar(255)
ts     timestamp  current_timestam


目标:我想创建触发器以将日志存储到table_log

这是触发器:

CREATE TRIGGER `table_insert` AFTER INSERT ON `table`
    FOR EACH ROW
    BEGIN
      INSERT INTO `table_log` (id, action, name, ts)
      VALUES(NEW.id, 'insert', NEW.name, NOW());
    END;

CREATE TRIGGER `table_update` AFTER INSERT ON `table`
    FOR EACH ROW
    BEGIN
      INSERT INTO table_log (id, action, name, ts)
      VALUES(NEW.id, 'update', NEW.name, NOW());
    END;

CREATE TRIGGER `table_delete` AFTER INSERT ON `table`
    FOR EACH ROW
    BEGIN
      INSERT INTO `table_log` (id, action, name, ts)
      VALUES(OLD.id, 'delete', OLD.name, NOW());
    END;


我尝试创建触发器,但是语法错误:

错误

SQL query:

CREATE TRIGGER `table_insert` AFTER INSERT ON  `table`
FOR EACH
ROW
BEGIN
INSERT INTO  `table_log` ( id,
ACTION , name, ts )
VALUES (

NEW.id,  'insert', NEW.name, NOW( )
);

MySQL said: Documentation

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 5

最佳答案

如果未设置除;以外的其他定界符,则该语句将在第一个;处结束,并且触发器定义将不完整。您需要告诉MySQL,该语句应以您定义的分隔符结尾。之后,您可以使用delimiter ;设置分隔符

delimiter |
CREATE TRIGGER `table_insert` AFTER INSERT ON  `table`
FOR EACH ROW BEGIN
  INSERT INTO  `table_log` ( id, ACTION , name, ts )
  VALUES (NEW.id,  'insert', NEW.name, NOW( ));
END
|
delimiter ;


并且不要使用TABLE作为表名!使用更具描述性的名称。

关于mysql - SQL跟踪器记录表中的更改,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24466732/

10-11 03:31
查看更多