4

有人可以告诉我我的代码语法有什么问题吗?(这是我要突出显示和运行的确切且唯一的代码,因此行号应该匹配)

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”附近使用正确的语法

4

3 回答 3

11

您忘记更改分隔符,所以 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 可以将完整的触发器识别为单个语句。

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

官方文档在定义存储程序部分对此进行了详细说明。


请注意,此问题仅影响一次可以接受多个语句的 MySQL 客户端,因此它们实现了分隔符来区分它们。DELIMITER是mysql命令行工具的一个命令;它可能会或可能不会在其他客户端中实现。

于 2012-11-21T11:18:34.947 回答
1

试试这个:

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 ;
于 2012-11-21T11:20:24.147 回答
1

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

  • 如果 body 中有一些语句,则 body 必须用 BEGIN...END 子句包裹。在这种情况下,您可能还需要对 CREATE TRIGGER 使用客户端 DELIMITER 命令。
  • 如果正文中有一条语句,则可以使用不带 BEGIN...END 且不带 DELIMITER 命令的语法。
于 2012-11-21T12:19:35.777 回答