计算的MYSQL列

时间:2017-04-23 21:25:09

标签: mysql sql calculated-columns

我目前有一个包含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。

2 个答案:

答案 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确实支持生成的列,因此这是最好的解决方案。