【问题标题】:How to automatically update a MYSQL column value using formula and data from other columns in same row?如何使用同一行中其他列的公式和数据自动更新 MYSQL 列值?
【发布时间】:2011-11-10 08:55:13
【问题描述】:

关于 mySQL 的问题。

我有一个包含如下列的表格:

BasePrice, Discount, NetPrice

现在假设净价的计算如下:

NetPrice = BasePrice - Discount

现在,我不介意使用 phpMyadmin 手动将 BasePriceDiscount 值输入列中(即直接后端更新)。由于NetPrice 值涉及如上所示的计算,我不想更新表中每一行的列值,但希望数据库为我自动更新它(not that I am weak at math :))。

有没有办法让数据库自动更新NetPrice 列的值?我知道我可以使用 php 来获取其他两列值,计算然后更新 NetPrice 值,再次使用 php 代码,但更喜欢 db 在没有任何 php/服务器端脚本的情况下自行完成。

我使用 mySQL 和 phpMyadmin 进行开发。

谢谢。

【问题讨论】:

  • 计算示例:BasePrice;折扣;净价 1000;100;900
  • 在您的情况下存储 NetPrice 不是一个好的设计,因为您可以在运行时计算。那么为什么要在 mysql 表中添加一个额外的列并为更新它而头疼呢。

标签: mysql phpmyadmin


【解决方案1】:

您可以使用单个查询来更新所有表:

UPDATE your_table
SET NetPrice = BasePrice - Discount

或者您可以在添加行时使用触发器来更改该列。
像这样的:

CREATE TRIGGER onInsert BEFORE INSERT ON `your_table`
FOR EACH ROW
BEGIN
    SET NEW.NetPrice = NEW.BasePrice - NEW.Discount;
END;

【讨论】:

  • +1。如果 UPDATE 语句修改了 BasePrice 或 Discount 列的值,则需要一个等效的 BEFORE UPDATE 触发器来保持 NetPrice 列“同步”。
【解决方案2】:

作为 Marco (+1) 答案的替代方案,对于插入,最简单的方法可能是引用先前在语句中分配的列。例如:

INSERT INTO t (BasePrice, Discount, NetPrice) VALUES (17.00, 2.50, BasePrice-Discount);

为了正确计算该 NetPrice 列,BasePriceDiscount 列必须出现在插入计算 NetPrice 的表达式之前之前。 (分配给每列的值稍后在语句中可用,列被分配一个值。)

如果您始终希望在修改 BasePrice 或 Discount 时确保 NetPrice 保持“同步”,那么 BEFORE UPDATE 触发器将为您完成此操作,因此 BEFORE INSERTBEFORE UPDATE 触发器的组合将是适当的。 (见 Marco 的回答。)

【讨论】:

    猜你喜欢
    • 2012-04-20
    • 2022-08-18
    • 1970-01-01
    • 2020-01-18
    • 2019-03-29
    • 2015-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多