Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 触发以保持总计_Mysql_Triggers - Fatal编程技术网

Mysql 触发以保持总计

Mysql 触发以保持总计,mysql,triggers,Mysql,Triggers,我已经为发票创建了一些表格 有一个发票\u标题和发票\u明细表。发票详细信息包含在发票详细信息行中、发票标题id、数量、单价、税额等 发票标题包含账单地址、发票号、发票总额等 我已经为插入/更新/删除创建了一个触发器,以便标题中的发票总额为总和(发票详细信息.数量*发票详细信息.单价) 有一种情况我不知道该如何应对。 如果我更新发票明细行,请将其与其他标题关联。 像这样 UPDATE invoice_details SET invoice_header_id=1 WHERE invoice_he

我已经为发票创建了一些表格

有一个发票\u标题和发票\u明细表。发票详细信息包含在发票详细信息行中、发票标题id、数量、单价、税额等

发票标题包含账单地址、发票号、发票总额等

我已经为插入/更新/删除创建了一个触发器,以便标题中的发票总额为总和(发票详细信息.数量*发票详细信息.单价)

有一种情况我不知道该如何应对。 如果我更新发票明细行,请将其与其他标题关联。 像这样

UPDATE invoice_details SET invoice_header_id=1 WHERE invoice_header_id=2

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

这对你不管用吗

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

在插入触发器中,只能使用NEW.col_名称;没有旧的 一行在删除触发器中,只能使用OLD.col_名称;没有 新的一排。在更新触发器中,可以使用OLD.col_名称来引用 更新前的行的列以及要引用的NEW.col_名称 更新后的行的列

名为with OLD的列是只读的。你可以参考它(如果你有 选择权限),但不修改它。你可以参考一列 如果您具有“选择”权限,则使用“新建”命名。在以前 触发器,也可以使用SET NEW.col_name=value更改其值 如果你有更新权限。这意味着您可以使用 触发器修改要插入新行或用于 更新一行。(此类SET语句在AFTER触发器中无效。) 因为行更改将已经发生。)

因此,您可以在触发器中使用OLD.invoice\u header\u id(2)和NEW.invoice\u header\u id(1)来更新invoice\u 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
在更新发票详细信息之前创建触发检查
每行
开始
如果NEW.invoice\u header\u id为OLD.invoice\u header\u id,则
您进行计算并更新两个发票标题行
如果结束;
结束

黑暗中的一枪,但你的扳机会产生什么样的效果?也许你需要在插入/更新之后而不是在之前进行
?只是一个想法:我会在你的详细信息上创建一个视图,动态计算标题。这样做总是正确的。您正在对数据进行非规范化,这通常会导致这样的麻烦。只有当性能是一个真正的问题时,你才应该考虑你的设计。“薄赫绵,我并没有真的认为视图是一种选择,我可能会放弃它。”干杯