2013-08-07 46 views
1

我试图用2个表在MySQL上创建一个触发器。我可以在另一个数据库中做到这一点,但在另一个数据库中调整的相同代码在几小时内给我语法错误!更新查询中的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; 

正如你可以在桌子上“用户”的更新后很容易地理解,其它的表被修改其中场“UID”是相等的。为什么它不工作?! 谢谢!

回答

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 ; 
+0

现在,它的正常工作,我认为这不是强制性的使用分隔符和开始结束块,事实上我没有在其他数据库中使用它们。使用它们有什么区别? 谢谢队友! – user1638466

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 
+0

谢谢!那么更新和哪里被认为是两个不同的陈述? – user1638466

+0

@ user1638466编号'UPDATE ...'是一个*语句*,它有一个WHERE子句*。一般说来,一个声明是以分号(';')结尾的。这里有你的'UPDATE ...;'语句和'IF ... THEN ... END IF'流程控制语句。 –

+0

明白了,我很新,触发器,你可以看到 – user1638466

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哟定义底栏上的分隔符//)

+0

以及我只是使用其他代码,它工作正常,但真正的问题是什么?我也只用了一个“;”它不起作用! 也谢谢你! – user1638466

+0

当你有多个语句时,你可以在mysql控制台中使用分隔符。看到这个问题更好的解释:http://stackoverflow.com/q/10259504/1385896 –

+0

好的再次感谢你;) – user1638466