MySQL在更新查询时触发语法错误

时间:2013-08-07 18:19:17

标签: mysql triggers

我正在尝试使用2个表在MySQL上创建一个触发器。我可以在另一个数据库中执行此操作,但在另一个数据库中调整相同的代码会在几小时后给出语法错误!

CREATE TRIGGER `free_video_used` AFTER UPDATE ON `user`     
FOR EACH ROW
IF new.field = 1 THEN
UPDATE free_video SET free_video.used = 1 WHERE free_video.uid = NEW.uid; 
END IF;

在对“user”表进行更新后,您可以轻松理解,另一个表被修改,其中字段“uid”相等。为什么不工作?! 谢谢!

3 个答案:

答案 0 :(得分:1)

尝试:

DELIMITER $$

CREATE TRIGGER `free_video_used` AFTER UPDATE ON `user`
FOR EACH ROW
BEGIN
    IF (new.field = 1) THEN
        UPDATE free_video SET free_video.used = 1 WHERE free_video.uid = new.uid;
    END IF;
END$$

DELIMITER ;

答案 1 :(得分:1)

如果您的触发器主体中有多个语句,则必须将它们括在BEGINEND之间。见http://dev.mysql.com/doc/refman/5.0/en/trigger-syntax.html

  

通过使用BEGIN ... END构造,您可以定义一个触发器   执行多个语句。在BEGIN块中,您也可以使用   存储例程中允许的其他语法,例如   条件和循环

在这里你必须写一些像这样的

CREATE TRIGGER `free_video_used` AFTER UPDATE ON `user`     
FOR EACH ROW
BEGIN
IF new.field = 1 THEN
UPDATE free_video SET free_video.used = 1 WHERE free_video.uid = NEW.uid; 
END IF;
END

答案 2 :(得分:1)

您的代码基本上是正确的,这是在同一语句中使用多个;的问题。

试试这样:

DELIMITER //
    CREATE TRIGGER `free_video_used` AFTER UPDATE ON `user`     
    FOR EACH ROW
    BEGIN
      IF new.field = 1 THEN
          UPDATE free_video SET free_video.used = 1 WHERE free_video.uid = NEW.uid; 
      END IF; 
    END
//

请参阅此fiddle以查看它是否有效(请注意,在sqlfiddle上,您可以在底栏上定义分隔符//)