计算MYSQL列

3

我目前有一张表格,包含四个列 - 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,第二行应该是60,而不是0。


可能是从另一列计算的列?的重复问题。 - user2988142
2个回答

4
如果你正在使用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;

0
我建议将其作为视图来处理:
create view v_calculation as
    select c.*, (valueone + valuetwo + valuethree) as additioncolumn
    from calculation c;

当您使用视图时,值会自动计算。因此,它始终是最新的。

如果您实际存储该值,则需要触发器以在底层列更改时保持其最新状态。这很麻烦,并增加了插入和更新的额外开销。

正如Bill所指出的那样,MySQL的最新版本支持生成列,因此这是最佳解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接