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

Kel*_*sen 4 mysql triggers if-statement 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;
Run Code Online (Sandbox Code Playgroud)

我收到这两个错误:

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

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

Álv*_*lez 10

你忘了更改分隔符,所以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;
Run Code Online (Sandbox Code Playgroud)

只需在代码之前添加:

DELIMITER $$
Run Code Online (Sandbox Code Playgroud)

......之后:

$$
Run Code Online (Sandbox Code Playgroud)

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

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

官方文档在" 定义存储程序"部分中提供了相关详细信息.