创建触发器中的语法错误,有什么问题?

时间:2012-11-21 11:12:12

标签: mysql if-statement triggers sql-update

请问有人告诉我代码的语法有什么问题吗? (这是我正在突出显示并运行的唯一代码,因此行号应匹配)

CREATE TRIGGER `trg_part_upd` AFTER UPDATE ON `tbl_sub_model_eng_trans_part`
 FOR EACH ROW 
    if NEW.engine_sk = 0 and NEW.trans_sk = 0
    then
        UPDATE tbl_sub_model tsm
        INNER JOIN tbl_fct_sub_eng_trans tfset ON tsm.sub_model_sk = tfset.sub_model_sk
        INNER JOIN tbl_sub_model_eng_trans_part tsmetp ON tfset.trans_sk = tsmetp.trans_sk
        SET tsm.last_modified_date = NOW()
        WHERE tsmetp.sub_model_sk=NEW.sub_model_sk;
    end if;

我得到了这两个错误:

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

错误代码:1064。您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以便在第1行的“end if”附近使用正确的语法

3 个答案:

答案 0 :(得分:9)

您忘记更改分隔符,因此MySQL认为您的第一个陈述是:

CREATE TRIGGER `trg_part_upd` AFTER UPDATE ON `tbl_sub_model_eng_trans_part`
 FOR EACH ROW 
    if NEW.engine_sk = 0 and NEW.trans_sk = 0
    then
        UPDATE tbl_sub_model tsm
        INNER JOIN tbl_fct_sub_eng_trans tfset ON tsm.sub_model_sk = tfset.sub_model_sk
        INNER JOIN tbl_sub_model_eng_trans_part tsmetp ON tfset.trans_sk = tsmetp.trans_sk
        SET tsm.last_modified_date = NOW()
        WHERE tsmetp.sub_model_sk=NEW.sub_model_sk;

只需在代码前添加:

DELIMITER $$

......之后:

$$

...所以MySQL可以将完整的触发器识别为单个语句。

您可以根据自己的选择更改$$

官方文档会在Defining Stored Programs部分详细说明。

答案 1 :(得分:0)

试试这个:

DELIMITER $$
CREATE TRIGGER `trg_part_upd` AFTER UPDATE ON `tbl_sub_model_eng_trans_part`
 FOR EACH ROW BEGIN 
    IF NEW.engine_sk = 0 AND NEW.trans_sk = 0
    THEN
        UPDATE tbl_sub_model tsm
        INNER JOIN tbl_fct_sub_eng_trans tfset ON tsm.sub_model_sk = tfset.sub_model_sk
        INNER JOIN tbl_sub_model_eng_trans_part tsmetp ON tfset.trans_sk = tsmetp.trans_sk
        SET tsm.last_modified_date = NOW()
        WHERE tsmetp.sub_model_sk=NEW.sub_model_sk;
    END IF;
  END;
$$

DELIMITER ;

答案 2 :(得分:0)

触发器是一个源对象,它有一个主体 - 一个或多个内部语句。

  • 如果正文中有一些陈述,则必须用BEGIN ... END子句包装正文。在这种情况下,您可能还需要对CREATE TRIGGER使用客户端DELIMITER命令。
  • 如果正文中有一个语句,则可以使用不带BEGIN ... END的语法,也可以不使用DELIMITER命令。