请问有人告诉我代码的语法有什么问题吗? (这是我正在突出显示并运行的唯一代码,因此行号应匹配)
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”附近使用正确的语法
答案 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)
触发器是一个源对象,它有一个主体 - 一个或多个内部语句。