从另一列计算的列?

鉴于下表:

id | value -------------- 1 6 2 70 

有没有办法添加一个基于另一列在同一个表中自动计算的列? 像VIEW一样,但是是同一张桌子的一部分。 作为一个例子, calculated将是value一半。 Calculated value应该在value更改时自动更新,就像VIEW一样。

结果将是:

 id | value | calculated ----------------------- 1 6 3 2 70 35 

如果这是一个select,你可以这样做:

 SELECT id, value, (value/2) AS calculated FROM mytable 

否则,您也可以首先更改表以添加缺less的列,然后执行UPDATE查询以计算新列的值,如下所示:

 UPDATE mytable SET calculated = value/2; 

如果它必须是自动的,并且你的MySQL版本允许,你可以尝试触发器

@ krtek的答案是正确的方向,但有几个问题。

坏消息是在同一张表的触发器中使用UPDATE将不起作用。 好消息是没有必要, 有一个新的对象,你可以在表甚至被触摸之前进行操作。

触发器变成:

 CREATE TRIGGER halfcolumn_update BEFORE UPDATE ON my_table FOR EACH ROW BEGIN SET NEW.calculated = NEW.value/2; END; 

还要注意,BEGIN … END; 语法必须用不同的分隔符来parsing。 整个shebang成为:

 DELIMITER | CREATE TRIGGER halfcolumn_insert BEFORE INSERT ON my_table FOR EACH ROW BEGIN SET NEW.calculated = NEW.value/2; END; | CREATE TRIGGER halfcolumn_update BEFORE UPDATE ON my_table FOR EACH ROW BEGIN SET NEW.calculated = NEW.value/2; END; | DELIMITER ; 

MySQL 5.7支持计算列。 他们把它称为“生成的列”,语法有点奇怪,但它支持我在其他数据库中看到的相同的选项。

https://dev.mysql.com/doc/refman/5.7/en/create-table.html#create-table-generated-columns

生成的列是5.7.6及以上的MySql版本的一个好方法。

有两种生成列:

  • 虚拟(默认) – 列将在从表中读取logging时即时计算
  • 当在表格中写入/更新新logging时,将计算存储列

两种types都可以有NOT NULL限制,但是只有存储的生成列可以是索引的一部分。

为了实现,我认为计算所需的两个值都在表格中

 CREATE TABLE order_details (price DOUBLE, quantity INT, amount DOUBLE AS (price * quantity)); INSERT INTO order_details (price, quantity) VALUES(100,1),(300,4),(60,8); 

金额会自动popup在表中,您可以直接访问它,也请每当您更新任何列时,金额也将得到更新。

如果你想添加一列到自动更新到其他列的一半的表中,你可以用触发器来实现。

但我认为已经提出的答案是一个更好的方法来做到这一点。

干编码触发器:

 CREATE TRIGGER halfcolumn_insert AFTER INSERT ON table FOR EACH ROW BEGIN UPDATE table SET calculated = value / 2 WHERE id = NEW.id; END; CREATE TRIGGER halfcolumn_update AFTER UPDATE ON table FOR EACH ROW BEGIN UPDATE table SET calculated = value / 2 WHERE id = NEW.id; END; 

我不认为你只能触发一次,因为我们必须回应的事件是不同的。

我希望这仍然有助于许多人可能会得到这篇文章的人。 如果你需要一个计算列,为什么不直接在视图中显示你想要的列呢? 不要只保存数据或使用触发器重载性能…只需在视图中显示已经格式化/计算的数据即可。

希望这可以帮助…