【问题标题】:Struggling with MySQL trigger与 MySQL 触发器作斗争
【发布时间】:2018-08-14 16:44:16
【问题描述】:

我想创建一个触发器,将订单的所有产品的总和插入到付款中,但我遇到了语法错误。以下是我目前写的内容:

CREATE TRIGGER set_total BEFORE INSERT on payments 
FOR EACH ROW 
BEGIN

DECLARE id INT(10);

DECLARE temp INT(10);

SET id:=new.Order;

SELECT SUM(Price) into temp

FROM products , order_products

WHERE order_products.Order LIKE id AND products.Products_ID=order_products.Products;

SET new.Total:=temp;

END;

我无法弄清楚我的语法错误,请帮忙。

编辑:#1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 2 行的 '' 附近使用正确的语法

【问题讨论】:

  • 你能把语法错误的意思写进去吗?
  • #1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 2 行的 '' 附近使用正确的语法

标签: mysql triggers phpmyadmin


【解决方案1】:

在多语句触发器、过程等...您需要临时覆盖分隔符,因此 MySQL 不认为它遇到的第一个 ; 正在结束触发器/过程/等...

DELIMITER $$

CREATE TRIGGER set_total BEFORE INSERT on payments 
FOR EACH ROW 
BEGIN

DECLARE id INT(10);
DECLARE temp INT(10);

SET id:=new.Order;

SELECT SUM(Price) into temp
FROM products , order_products
WHERE order_products.Order LIKE id AND products.Products_ID=order_products.Products;

SET new.Total:=temp;

END$$

DELIMITER ;

旁注:这通常被认为是用于计算总和的更好的查询形式:

SELECT SUM(Price) into temp
FROM products
INNER JOIN order_products ON products.Products_ID=order_products.Products
WHERE order_products.Order = id;

另外:小心声明可能被模棱两可地解释为字段名的变量名;如果products 和/或order_products 有一个id 字段,那么“where”条件可能会导致意外结果;充其量它仍然会使阅读变得不必要地困难。

【讨论】:

  • 非常感谢,所以问题出在分隔符上?如果不打扰你,你能解释一下为什么没有分隔符触发器就不能工作吗
  • 我原贴不解释;我编辑的附加文本能回答你吗?
  • 是的,再次感谢您对我帮助很大的解释
猜你喜欢
  • 1970-01-01
  • 2021-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 2013-12-06
  • 2019-04-20
  • 1970-01-01
相关资源
最近更新 更多