【问题标题】:MySQL Create Trigger Syntax Error (Last Line)MySQL 创建触发器语法错误(最后一行)
【发布时间】:2020-10-17 12:43:36
【问题描述】:

我正在创建一个 MySQL 触发器,用于在 UPDATE 查询更改某些值时使用新值更新各种表。我不断收到此特定触发器的以下语法错误:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 29

在这种情况下,第 29 行是 END 语句的行。

这是我的完整代码:

DELIMITER $$
CREATE TRIGGER update_selling_prices BEFORE UPDATE ON t1
FOR EACH ROW
BEGIN
    DECLARE update_price INT DEFAULT 0;
    DECLARE selling_price_1 DECIMAL(10, 3) DEFAULT 0.000;
    DECLARE selling_price_2 DECIMAL(10, 3) DEFAULT 0.000;
    IF (OLD.rrp_price <> NEW.rrp_price OR OLD.discount_1 <> NEW.discount_1 OR OLD.discount_2 <> NEW.discount_2 OR OLD.net_price <> NEW.net_price OR OLD.markup <> NEW.markup OR OLD.delivery_cost <> NEW.delivery_cost) THEN
        SET update_price = (SELECT b.is_auto_update FROM price_categories c INNER JOIN brands b ON b.brand_name = c.brand_name WHERE c.id = NEW.category_id LIMIT 1);
        IF (update_price = 1) THEN
            IF (NEW.is_bundle = 0) THEN
                UPDATE t2 SET temp = 'Fired Single' WHERE id = NEW.id;
            ELSE IF (NEW.is_bundle = 1) THEN
                UPDATE t2 SET temp = 'Fired Bundle' WHERE id = NEW.id;
            END IF;
        END IF;
    END IF;
END;
$$
DELIMITER ;

当前的 UPDATE 语句只是我将要进行的一些实际计算的占位符。

请注意:我将 Sequel Pro 用于大多数与 MySQL 相关的东西,最初是使用他们的 GUI 来尝试添加触发器 - 它会自动添加周围的代码,所以我只会在 BEGIN之间创建所有内容> 和 END 语句。这也导致了同样的语法错误,所以我不相信它与分隔符有关,就像我已经在这里找到的一些类似线程一样。尽管如此,我还是尝试通过普通查询添加完整的触发代码;更改分隔符语法 - 例如 END$$END $$END; $$ 等等。

我已经成功创建了其他具有类似语法的触发器,但它们不包括 DECLARE 语法。

我哪里错了?

【问题讨论】:

标签: mysql syntax triggers database-trigger


【解决方案1】:

问题出在这里:

IF (NEW.is_bundle = 0) THEN
    UPDATE t2 SET temp = 'Fired Single' WHERE id = NEW.id;
ELSE IF (NEW.is_bundle = 1) THEN
    UPDATE t2 SET temp = 'Fired Bundle' WHERE id = NEW.id;
END IF;

查看文档:https://dev.mysql.com/doc/refman/8.0/en/if.html

MySQL 支持ELSEIF,这与ELSE IF 不同。如果您使用ELSEIF,这将延续IF 语句的结构。如果你使用ELSE IF,它会启动一个新的IF 语句,所以应该是这样的:

IF (NEW.is_bundle = 0) THEN
    UPDATE t2 SET temp = 'Fired Single' WHERE id = NEW.id;
ELSE 
    IF (NEW.is_bundle = 1) THEN
        UPDATE t2 SET temp = 'Fired Bundle' WHERE id = NEW.id;
    END IF;
END IF;

看到外面的ELSE 块中有一个完整的IF/THEN/END IF 语句吗?

但你没有这样做,所以 END IF 应用于最里面的 IF 语句,然后你在触发器主体的其余部分处于一个水平。

当 MySQL 到达整个 CREATE TRIGGER 语句的末尾时,如果没有足够的 END 来平衡您开始的块,MySQL 会抱怨您看到的错误。

【讨论】:

  • 非常感谢!我没有考虑 ELSE IF 和 ELSEIF 之间的区别。将其更改为 ELSEIF(这是我想要的)已经解决了问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-09
  • 1970-01-01
相关资源
最近更新 更多