如何使用同一行中其他列的公式和数据自动更新MYSQL列值?

aru*_*air 3 mysql phpmyadmin

关于mySQL的问题.

我有一个表格,如下所示:

BasePrice, Discount, NetPrice
Run Code Online (Sandbox Code Playgroud)

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

NetPrice = BasePrice - Discount
Run Code Online (Sandbox Code Playgroud)

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

有没有让数据库NetPrice自动更新列值?我知道我可以使用php获取其他两个列值,计算然后NetPrice再次使用PHP代码更新值,但更喜欢db自己做它而没有任何php /服务器端脚本.

我使用mySQL和phpMyadmin作为dev.

谢谢.

Mar*_*rco 5

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

UPDATE your_table
SET NetPrice = BasePrice - Discount
Run Code Online (Sandbox Code Playgroud)

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

CREATE TRIGGER onInsert BEFORE INSERT ON `your_table`
FOR EACH ROW
BEGIN
    SET NEW.NetPrice = NEW.BasePrice - NEW.Discount;
END;
Run Code Online (Sandbox Code Playgroud)


spe*_*593 5

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

INSERT INTO t (BasePrice, Discount, NetPrice) VALUES (17.00, 2.50, BasePrice-Discount);
Run Code Online (Sandbox Code Playgroud)

为了正确计算 NetPrice 列,BasePrice和列必须出现在计算 的表达式之前的Discount插入内容中。(分配给每列的值可在语句中稍后为该列分配值后使用。)NetPrice

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