2017-04-23 101 views
1

我目前有一个表,有4列 - valueone,valuetwo,valuethree和additioncolumn。我想知道如何使additioncolumn store增加valueone + valuetwo + valuethree。计算MYSQL列

我是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); 

值0应该是第一行30和第二行60。

回答

1

如果您使用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确实支持生成的列,所以这是最好的解决方案。