''附近的MySQL语法错误

时间:2014-03-17 05:00:01

标签: mysql sql triggers

我比T-SQL更习惯于MySQL,似乎有一些轻微的语法问题我无法理解。我收到一条似乎对我来说毫无意义的错误信息,如果有人能告诉我我在这里做错了什么,我真的很感激。我可能不允许在UPDATE TRIGGER中进行更新吗?

我的想法是,我想跟踪我当前的德国日志是否已被更正,并根据我是否更新我的日志部分或我的导师来记录时间更新他们的部分。

我的代码是:

DELIMITER //

CREATE TRIGGER updateTimes
AFTER UPDATE ON Logs
FOR EACH ROW

BEGIN

    IF (Old.TimGerman <> New.TimGerman OR
        Old.TimComment <> New.TimComment)
    THEN
            UPDATE Logs 
                SET DateUpdated = CURRENT_TIMESTAMP, Corrected = 0
                WHERE LogID = New.LogID;

    ELSE IF (Old.TutorGerman <> New.TutorGerman OR
                Old.TutorComment <> New.TutorComment)
    THEN
            UPDATE Logs
                SET DateMarked = CURRENT_TIMESTAMP, Corrected = 1
                WHERE LogID = New.LogID;
    END IF;
END //
DELIMITER ;

我的错误信息显示:

SQL Error (1064): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax near '' at line 21.

第21行是从底部开始的第4个:WHERE LogID = New.LogID;

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

ELSE IF部分外,语法上你的触发是正确的。如果要使用它,则需要额外的END IF。否则将其修改为ELSEIF

此外,您似乎需要BEFORE触发器而不是AFTER触发器 除此之外,在同一个表上的update触发器中调用显式update意味着更少,因为它会导致循环事件。哪个不受支持并抛出错误。

更改您的触发器定义,如下所示:

DELIMITER //

CREATE TRIGGER updateTimes BEFORE UPDATE ON Logs
FOR EACH ROW
BEGIN
    IF ( OLD.LogID = New.LogID ) THEN
         IF ( Old.TimGerman <> New.TimGerman OR
              Old.TimComment <> New.TimComment )
         THEN
             SET NEW.DateUpdated = CURRENT_TIMESTAMP, NEW.Corrected = 0;

         ELSEIF ( Old.TutorGerman <> New.TutorGerman OR
                  Old.TutorComment <> New.TutorComment )
         THEN
             SET NEW.DateMarked = CURRENT_TIMESTAMP, NEW.Corrected = 1;
         END IF;
     END IF;
END;
//

DELIMITER ;