2012-02-10 84 views
0

使用InnoDB在MySQL 5.5.9上运行。MySQL触发语法错误

我创建了以下触发:

CREATE TRIGGER TRIGGER_Products_Insert 
AFTER INSERT ON Products 

FOR EACH ROW 
BEGIN 
UPDATE Products 
SET current = 0 
WHERE id = new.id 
    AND current = 1 
    AND autonumber <> new.autonumber 
END; 

MySQLWorkbench显示在最后一行语法错误,并执行,这将引发以下错误

错误代码:1064你有一个错误你的SQL语法;请检查与您的MySQL服务器版本对应的手册,以便在第11行'END'附近使用正确的语法。

我的错误在哪里?

回答

2

http://dev.mysql.com/doc/refman/5.5/en/create-trigger.html

DELIMITER | 

CREATE TRIGGER TRIGGER_Products_Insert AFTER INSERT ON Products 
    FOR EACH ROW BEGIN 
     UPDATE Products 
     SET current = 0 
     WHERE id = new.id 
      AND current = 1 
      AND autonumber <> new.autonumber; 
    END; 
| 

DELIMITER ; 
+0

这个工作,但我不知道为什么'DELIMITER'的东西是必要的。 – 2012-02-10 11:31:03

+1

因为'BEGIN ... END'是触发器的“主体”。所以,它必须是当前查询的一部分。 ';'默认情况下是一个分隔符,所以当MySQL到达它时,它认为这是查询的结束并且不能解析它。此外,您必须将定界符放在触发器的“正文”中,因为它会以其他方式失效。所以,为了满足这个要求,我们需要在触发器的“主体”中使用两个不同的定界符,并在查询中使用它自己。对不起,我的英文太难描述这个不太明显的东西了... – Timur 2012-02-10 11:37:53

+0

这里比较好描述:http://dev.mysql.com/doc/refman/5.5/en/begin-end.html(第三段,以“使用多个语句要求客户端能够”开头) – Timur 2012-02-10 11:42:39

0

你是你END关键字之前缺少;

CREATE TRIGGER TRIGGER_Products_Insert 
AFTER INSERT ON Products 

FOR EACH ROW 
BEGIN 
UPDATE Products 
SET current = 0 
WHERE id = new.id 
    AND current = 1 
    AND autonumber <> new.autonumber; 
END; 
+0

不工作,使双方的最后现在的倒数第二行的错误。 – 2012-02-10 11:29:04