2

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

有一个 invoice_header 和 invoice_detail 表。发票明细包含发票明细行、invoice_header_id、qty、unit_price、tax_amount 等

发票抬头有帐单地址、发票编号、发票总额等

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

有一种情况我不知道如何处理。如果我更新 invoice_detail 行,将其与不同的标题相关联。像这样

UPDATE invoice_details SET invoice_header_id=1 WHERE invoice_header_id=2

触发器将触发,但它会更新旧的标题记录总数,而不是新的。我该如何应对这种情况?

4

1 回答 1

1

这不适合你吗?

Mysql 触发语法

在触发器正文中,OLD 和 NEW 关键字使您能够访问受触发器影响的行中的列。OLD 和 NEW 是 MySQL 对触发器的扩展;它们不区分大小写。

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

以 OLD 命名的列是只读的。您可以参考它(如果您有 SELECT 权限),但不能修改它。如果您具有 SELECT 权限,则可以引用以 NEW 命名的列。在 BEFORE 触发器中,如果您具有 UPDATE 权限,您还可以使用 SET NEW.col_name = value 更改其值。这意味着您可以使用触发器来修改要插入新行或用于更新行的值。(这样的 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
于 2013-07-26T23:37:15.647 回答