MySQL 创建触发器语法错误(最后一行)

MySQL Create Trigger Syntax Error (Last Line)

我正在创建一个 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 来尝试添加触发器 - 它会自动添加周围的代码,所以我只会创建BEGINEND 语句之间的所有内容。这也导致了同样的语法错误,所以我不认为它与分隔符有关,就像我已经在此处找到的一些类似线程一样。不过,我已经尝试通过普通查询添加完整的触发器代码;更改定界符语法 - 例如 END$$END $$END; $$

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

我哪里错了?

问题出在这里:

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 会抱怨您看到的错误。