我创建了一些用于开发票的表格。
有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
触发器将触发,但它将更新旧的标头记录总数,但不会更新新标头记录总数。我怎样才能满足这种情况呢?
答案 0 :(得分:1)
这不适合你吗?
在触发器主体中,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