我比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;
非常感谢您的帮助!
答案 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 ;