MySQL在插入数据时自动更新字段

时间:2014-08-08 21:18:14

标签: php mysql sql database

我正在制作一个Web应用程序,以便客户订购用于antyhing的商品。为此,我创建了一个MySQL数据库,其中包含以下表格:

  • customers
  • orders
  • orders-items
  • products

customers表格中有关于此人的所有信息,例如:

  • 客户ID,主键和自动增量(id)
  • 第一个名字(first_name)
  • 姓氏(last_name)
  • 电子邮件地址(email_adress)
  • 有关客户的信息(customer_info)

示例:

enter image description here

orders表中有关于它的所有具体信息,例如:

  • 订单ID,主键和自动递增(id)
  • 它订购的客户,与id表(customer_id)中的customers字段相关联
  • 订单信息(order_info)
  • 订单需要转到的位置(位置)
  • 客户必须支付的总价格(total_price)
  • 创建(创建)订单时

示例:

enter image description here

orders-items表中,每个客户订购的所有商品都是由上一张表中的order-id链接的。

  • 主键和自动增量的ID,不用于任何关系(id)
  • 用于产品的订单ID适用于订单。这与id表(order_id)
  • 中的orders字段相关联
  • 产品ID,用于订购的产品,与products表中的id字段相关联。 (产品)
  • 他们订购的产品数量(数量)

示例:

enter image description here

products表格中有关于产品的所有信息:

  • 主键和自动递增的ID,与product_id表(id)
  • 中的order_items字段相关联
  • 产品名称(名称)
  • 产品说明(说明)
  • 产品价格(价格)

示例:

enter image description here

问题:

我收到了这个问题:

SELECT `orders-items`.`order_id` , SUM(`orders-items`.`quantity`* `products`.`price`) total
FROM  `orders-items` 
INNER JOIN  `Products` ON  `orders-items`.`products_id` =  `products`.`id` 

它向我显示了order_id必须支付的所有总价格的列表。

但是我如何做到这一点,以便total_price每个order_id必须支付的价值自动插入到orders字段内的total_price表中将产品插入我的order_id表时,是orders-list吗?

或者是否更好地跟踪total_prices customers必须支付的费用?

2 个答案:

答案 0 :(得分:4)

要考虑几件事。

拥有total_price本身就是多余的。您可以随时通过汇总此订单商品的价格来了解此总数。出于性能原因,它可能很有趣,但这对您的场景来说真的有必要吗?它很少。

另一方面,在每个price上设置order_item会很有用。原因是因为未来产品价格可能会发生变化,您不希望丢失有关特定销售时销售量的信息。

在任何情况下,您都可以使用这样的触发器更新total_price

DELIMITER $$

CREATE TRIGGER order_items_insert AFTER INSERT ON `orders-items` FOR EACH ROW
BEGIN
    UPDATE orders o INNER JOIN (SELECT i.order_id id, SUM(i.quantity * p.price) total_price FROM `orders-items` i INNER JOIN products p ON p.id = i.products_id AND i.order_id = new.order_id) t ON t.id = o.id SET o.total_price = t.total_price;
END$$

CREATE TRIGGER order_items_update AFTER UPDATE ON `orders-items` FOR EACH ROW
BEGIN
    UPDATE orders o INNER JOIN (SELECT i.order_id id, SUM(i.quantity * p.price) total_price FROM `orders-items` i INNER JOIN products p ON p.id = i.products_id AND i.order_id = new.order_id) t ON t.id = o.id SET o.total_price = t.total_price;
END$$

CREATE TRIGGER order_items_delete AFTER DELETE ON `orders-items` FOR EACH ROW
BEGIN
    UPDATE orders o INNER JOIN (SELECT i.order_id id, SUM(i.quantity * p.price) total_price FROM `orders-items` i INNER JOIN products p ON p.id = i.products_id AND i.order_id = old.order_id) t ON t.id = o.id SET o.total_price = t.total_price;
END$$

DELIMITER ;

答案 1 :(得分:1)

一个选项是trigger,在插入新客户时执行。

备选你可以选择stored procedure。有了这个,您只需要调用过程InsertCustomer,数据库就会为您处理价格更新 - >您的应用程序中不会有这些依赖项。

另一种方法是,在transaction中进行2次查询(插入和更新)。但为此,我建议Domain Driven Design。您将拥有一个具有方法CreateCustomer(Customer $customer)的服务,该服务执行插入查询,然后执行更新查询。成功时,它提交事务并返回true,如果不成功,则取消事务并重新设置false。只有在服务(知道业务逻辑)的帮助下操作数据应该是你自己的惯例。