【问题标题】:Declare inside if condition showing syntax error - MYSQL Triggers如果条件显示语法错误,则在内部声明 - MYSQL 触发器
【发布时间】:2021-02-12 23:28:57
【问题描述】:

我尝试在插入前使用触发器更新一些列

  DROP TRIGGER IF EXISTS update_p_posts_places;
DELIMITER $$
CREATE TRIGGER update_p_posts_places BEFORE
INSERT
ON
    `p_posts` FOR EACH ROW
BEGIN      
    DECLARE
        p_post_group_id_ int;
    SELECT
        `p_post_subgroup`.`p_post_group_id`
    INTO
        p_post_group_id_
    FROM
        `p_post_subgroup`
    WHERE
        `p_post_subgroup`.`p_post_subgroup_id` = NEW.p_post_subgroup_id;
        IF(p_post_group_id_ = 5) THEN
        BEGIN
        DECLARE
            place1_id_ int;
            place2_id_ int;
            place3_id_ int;
            place4_id_ int;
            place5_id_ int;
        SELECT
            `Places`.`place1_id`,
            `Places`.`place2_id`,
            `Places`.`place3_id`,
            `Places`.`place4_id`,
            `Places`.`place5_id`
        INTO
            place1_id_, place2_id_, place3_id_, place4_id_, place5_id_
        FROM
            `Places`
        WHERE
            `Places`.`place5_id` = NEW.p_post_place_id LIMIT 1;
    SET NEW.place5_id = place5_id_;
    SET NEW.place1_id = place1_id_;
    SET NEW.place2_id = place2_id_;
    SET NEW.place3_id = place3_id_;
    SET NEW.place4_id = place4_id_;
    END $$
    ELSE
SET NEW.place5_id = NULL;
END IF;
END $$
DELIMITER ;

它显示了一些语法错误。

#1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以了解在 'DECLARE 附近使用的正确语法 place1_id_ int; place2_id_ int; ' 在第 20 行

【问题讨论】:

  • 声明的变量必须紧跟在 BEGIN 之后,而且你有比你需要的更多的开始。
  • 我更新了我的查询。同样的错误。
  • 你的第一端应该由 ; 终止(分号)不是 $$ 并且每个变量都需要一个 DECLARE
  • 您的代码中有END $$。在DELIMITER ;之前应该只使用一次
  • 在 DECLARE 中,变量必须用 , 分隔,而不是 ;

标签: mysql


【解决方案1】:

这是一个有效的触发器。我在 MySQL 5.7 上测试过创建它。

CREATE TRIGGER update_p_posts_places BEFORE INSERT ON `p_posts`
FOR EACH ROW
BEGIN      
    -- all declarations must be before any other statements
    DECLARE p_post_group_id_, place1_id_, place2_id_, place3_id_,
        place4_id_, place5_id_ int;
    SELECT
        `p_post_subgroup`.`p_post_group_id`
    INTO
        p_post_group_id_
    FROM
        `p_post_subgroup`
    WHERE
        `p_post_subgroup`.`p_post_subgroup_id` = NEW.p_post_subgroup_id;
    IF(p_post_group_id_ = 5) THEN
        SELECT
            `Places`.`place1_id`,
            `Places`.`place2_id`,
            `Places`.`place3_id`,
            `Places`.`place4_id`,
            `Places`.`place5_id`
        INTO
            place1_id_, place2_id_, place3_id_, place4_id_, place5_id_
        FROM
            `Places`
        WHERE
            `Places`.`place5_id` = NEW.p_post_place_id LIMIT 1;
        SET NEW.place5_id = place5_id_;
        SET NEW.place1_id = place1_id_;
        SET NEW.place2_id = place2_id_;
        SET NEW.place3_id = place3_id_;
        SET NEW.place4_id = place4_id_;
    ELSE
        SET NEW.place5_id = NULL;
    END IF;
END $$

您可以将一个DECLARE 用于多个局部变量,但您必须像var1, var2, var3, ... int 一样使用。换句话说,在最后只为类型命名一次。见文档:https://dev.mysql.com/doc/refman/8.0/en/declare-local-variable.html

IF 中不需要BEGIN..END,并且绝对不要在最后一个END 之后使用$$,因为这将在完成之前终止解析器对整个CREATE TRIGGER 语句的解释。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-09
    • 1970-01-01
    • 2021-06-23
    • 2019-01-13
    • 2015-06-02
    • 2017-07-29
    • 2013-07-19
    相关资源
    最近更新 更多