这个sql触发器在哪里包含语法错误?

时间:2011-11-09 20:38:26

标签: mysql

花了大约一个小时来理解。 这个sql触发器在哪里包含语法错误?

CREATE
TRIGGER playlis_trubric_count_on_playlist_shared_update
AFTER UPDATE ON playlist_playlist
  FOR EACH ROW
    IF (NEW.shared != OLD.shared) AND (NEW.shared = 1) THEN
        UPDATE etv.playlist_playlistrubric 
            SET count = playlist_playlistrubric.count + 1
        WHERE etv.playlist_playlistrubric.id = NEW.rubric_id;
    ELSEIF (NEW.shared != OLD.shared) AND (NEW.shared = 0) THEN
        UPDATE etv.playlist_playlistrubric
            SET count = playlist_playlistrubric.count - 1
        WHERE etv.playlist_playlistrubric.id = NEW.rubric_id
    END IF;

错误说:

  

您的SQL语法有错误;检查手册   对应于您的MySQL服务器版本,以便使用正确的语法   靠近'ELSEIF(NEW.shared!= OLD.shared)和(NEW.shared = 0)那么           UPDATE etv.p'在第1行

1 个答案:

答案 0 :(得分:2)

来自the documentation

  

通过使用BEGIN ... END构造,您可以定义一个触发器   执行多个语句。BEGIN块中,您也可以使用   存储例程中允许的其他语法,例如   条件和循环。 但是,就像你存储的例程一样   使用 mysql 程序定义执行多个的触发器   语句,有必要重新定义 mysql 语句分隔符   这样你就可以使用;触发器内的语句分隔符   定义。以下示例说明了这些要点。它定义了   一个UPDATE触发器,用于检查要用于更新的新值   每行,并将值修改为0到100的范围。   这必须是BEFORE触发器,因为需要检查该值   在用于更新行之前:

mysql> delimiter //
mysql> CREATE TRIGGER upd_check BEFORE UPDATE ON account
    -> FOR EACH ROW
    -> BEGIN
    ->     IF NEW.amount < 0 THEN
    ->         SET NEW.amount = 0;
    ->     ELSEIF NEW.amount > 100 THEN
    ->         SET NEW.amount = 100;
    ->     END IF;
    -> END;//
mysql> delimiter ;

你错过了BEGINEND,你也需要分隔符技巧,因为目前你的触发器定义在第一个NEW.rubric_id结束(这就是为什么在该点之后发生解析错误。)