触发保持总量

时间:2013-07-26 23:28:06

标签: mysql triggers

我创建了一些用于开发票的表格。

有invoice_header和invoice_detail表。发票明细包含在发票明细行中,invoice_header_id,qty,unit_price,tax_amount等

发票标题包​​含帐单邮寄地址,发票号,invoice_total等

我已经为插入/更新/删除创建了一个触发器,因此标题中的invoice_total是总和(invoice_details.qty * invoice_details.unit_price)

有一个案例我不知道如何照顾。 如果我更新invoice_detail行,则将其与不同的标题关联。 像这样

UPDATE invoice_details SET invoice_header_id=1 WHERE invoice_header_id=2

触发器将触发,但它将更新旧的标头记录总数,但不会更新新标头记录总数。我怎样才能满足这种情况呢?

1 个答案:

答案 0 :(得分:1)

这不适合你吗?

来自Mysql trigger syntax

  

在触发器主体中,OLD和NEW关键字使您可以访问   受触发器影响的行中的列。旧的和新的是MySQL   触发器的扩展;它们不区分大小写。

     

在INSERT触发器中,只能使用NEW.col_name;没有旧的   行。在DELETE触发器中,只能使用OLD.col_name;没有   新排。在UPDATE触发器中,您可以使用OLD.col_name来引用   更新之前的行的列和要引用的NEW.col_name   更新后的行的列。

     

以OLD命名的列是只读的。你可以参考它(如果你有的话)   SELECT权限),但不能修改它。你可以参考一个专栏   如果您具有SELECT权限,则以NEW命名。在BEFORE   触发器,您还可以使用SET NEW.col_name = value更改其值   如果你有UPDATE权限。这意味着你可以使用   触发器修改要插入新行或用于的值   更新一行。 (这样的SET语句在AFTER触发器中没有效果   因为行更改已经发生。)

那么,您将拥有OLD.invoice_header_id(2)和NEW.invoice_header_id(1)触发器内部以更新invoice_header

CREATE TRIGGER check BEFORE UPDATE ON invoice_detail
FOR EACH ROW
BEGIN
    IF NEW.invoice_header_id <> OLD.invoice_header_id THEN
        You Do the math and update both invoice_header lines
    END IF;
END