这个mysql触发器有什么问题吗?

时间:2010-10-23 03:25:29

标签: mysql triggers e-commerce

我有一个product,sales_order和sales_order_product表。

产品的性质决定了价格和重量的频繁变化。

客户经常会在提交和付款前几天保存订单。

由于这种滞后和价格/重量波动,我们允许他们在原始订单时冻结价格/重量。

我们在sales_order表中的一些其他内容中保存订单金额(小计),销售税,订单重量。

我知道不建议在数据库层中使用任何业务逻辑,尽管我认为这是维护参照完整性的更多手段。

以下是我用来计算上述数据的触发器之一。我只是开始测试它,到目前为止一直很好。性能方面,到目前为止我还没有看到任何问题,但我的测试还不是很广泛。

这个触发器有什么不合适的吗?我问,因为虽然我已经使用触发器来记录时间戳,但我从来没有真正使用它们(考虑到我们正在谈论金钱,我不想搞砸一些可能让我失去工作的东西)。

我意识到硬编码税率可能不是一个好主意,而且我可能会在时机成熟时改变它。

CREATE TRIGGER after_sales_order_product_update
AFTER UPDATE ON sales_order_product
FOR EACH ROW
BEGIN

    SET @product_amount = (SELECT SUM(quantity * unit_price) 
                           FROM sales_order_product 
                           WHERE sales_order_id = OLD.sales_order_id),
        @product_discount = (SELECT SUM(quantity * unit_discount) 
                             FROM sales_order_product 
                             WHERE sales_order_id = OLD.sales_order_id),
        @total_weight = (SELECT SUM(quantity * unit_weight) 
                         FROM sales_order_product 
                         WHERE sales_order_id = OLD.sales_order_id),
        @tax_amount = ROUND(@product_amount * 0.0975,2);

    UPDATE sales_order 
    SET product_amount = @product_amount,
        product_discount = @product_discount,
        tax_amount = @tax_amount,
        total_weight = @total_weight,
        product_total = product_amount - product_discount
    WHERE sales_order_id = OLD.sales_order_id;

END

1 个答案:

答案 0 :(得分:0)

你的设计看起来不错;只是一些想法:

  1. 您的触发器仅在UPDATE后触发。如果第一行INSERTDELETE d之后的行?
  2. 怎么办?
  3. NULL怎么样?如果任何核心字段(quantityunit_priceunit_discountunit_weight)可能为null,那么您将在导出的字段中显示空值,这可能是您不期望的
  4. 没有行(NULL s)。如果客户从购物车中删除了一行,sales_order可能没有sales_order_products吗?在这种情况下,您可能希望sales_order值为零,这可能需要特殊编码。
  5. 订单状态。订单完成后会发生什么?销售完成后,无论发生什么事情(税率等变化),都应该修正这些值,因此在更新任何内容之前,您可能需要触发器检查订单状态。
  6. 您可以通过做一些基于故事板/场景的测试来解决所有这些问题。