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