我目前有一个包含4列的表 - valueone,valuetwo,valuethree和additioncolumn。我想知道如何使additioncolumn存储增加valueone + valuetwo + valuethree。
我是MySQL新手并尝试了一些我在网上找到的语法,但仍然没有区别。
CREATE TABLE `calculation` (
`valueone` int(11) NOT NULL,
`valuetwo` int(11) NOT NULL,
`valuethree` int(11) NOT NULL,
`id` int(11) NOT NULL AUTO_INCREMENT,
`additioncolumnn` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
INSERT INTO `calculation` VALUES (10,10,10,1,0),(20,20,20,2,0);
第一行30应为0,第二行应为60。
答案 0 :(得分:2)
如果您使用的是MySQL 5.7,则可以使用生成的列。见https://dev.mysql.com/doc/refman/5.7/en/create-table-generated-columns.html
CREATE TABLE `calculation` (
`valueone` int(11) NOT NULL,
`valuetwo` int(11) NOT NULL,
`valuethree` int(11) NOT NULL,
`id` int(11) NOT NULL AUTO_INCREMENT,
`additioncolumnn` int(11) AS (`valueone`+`valuetwo`+`valuethree`),
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
如果您在引入生成列的功能之前使用旧版本的MySQL,则必须使用触发器:
CREATE TRIGGER CalcOnInsert BEFORE INSERT ON calculation
FOR EACH ROW
SET NEW.additionalcolumn = NEW.valueone + NEW.valuetwo + NEW.valuethree;
CREATE TRIGGER CalcOnUpdate BEFORE UPDATE ON calculation
FOR EACH ROW
SET NEW.additionalcolumn = NEW.valueone + NEW.valuetwo + NEW.valuethree;
答案 1 :(得分:0)
我建议这样做:
create view v_calculation as
select c.*, (valueone + valuetwo + valuethree) as additioncolumn
from calculation c;
使用视图时,会自动计算该值。因此,它始终是最新的。
如果您实际存储了该值,则需要一个触发器,以便在其中一个基础列发生更改时使其保持最新状态。这是插入和更新的麻烦和额外开销。
Bill指出,最新版本的MySQL确实支持生成的列,因此这是最好的解决方案。