MySQL:计算列

4

我刚开始使用SQL并遇到了一个问题。

在我的数据库中,我目前有两个表Cinemas和Theatres。 我正在尝试在Cinemas表中创建一个列“# of Theatres#”,该列计算Theatres表中与Cinemas表中的Cinema具有相同CinemaID(外键)的Theatres数量。 我已经将其作为SQL查询使其工作:

SELECT cinemas.CinemaID,Town,COUNT(*) AS '# of Theatres'
FROM cinemax.cinemas,cinemax.theatres
WHERE cinemas.CinemaID=theatres.CinemaID
GROUP BY cinemas.CinemaID;

我想知道是否可以在电影院表中创建一个列,自动执行上述查询并将值插入到每一行中。

这将是一个非常小的数据库,因此速度并不是真正的问题,我只是想学习如何创建这样的计算列(即使可能)。


1
你尝试过使用触发器吗?看看这篇帖子:https://dev59.com/3G435IYBdhLWcg3wxDH_。希望能帮到你 :) - Victor
1
只需使用MySQL视图即可! - azerafati
4个回答

12

计算列通常是指您可以对每行计算的值。MySQL不支持该功能,但SQL Server支持。例如,要永久存储两个列的总和:

create table Table1 (a int, b int, c as a+b persisted)

然而,您希望存储一个聚合值,即一组行的值。MySQL和SQL Server不支持带有聚合的材料化视图,但是Oracle支持:

create table Table1 (a int, b int);

create materialized view View1 as
select  a
,       count(*) as Cnt
from    Table1
group by
    a;

然而,使用MySQL时,最接近的方法是定期填充表的cron作业:

truncate table Table1Summary;
insert Table1Summary (a, Cnt) select a, count(*) from Table1;
你可以像查询材料化视图一样查询该表;它会很快,但不能保证是最新的。

感谢您的帮助,我猜坚持使用查询可能更有意义,因为它总是最新的。 - Matt
1
MySQL 5.7支持生成列,其中可以存储或虚拟表达式,并且虚拟生成列可以被索引,索引存储该值。https://dev.mysql.com/doc/refman/5.7/en/create-table-generated-columns.html - karmakaze

4

这是可能的。但你不应该这样做。

这被称为去规范化,通常并不是一个好主意。

然而,有时候你可能绝对需要为了某些奇怪的原因去规范化某些东西(你的例子远非一个好的原因)。在这些情况下,你需要添加触发器代码来自动管理值,无论何时系统中的任何变化都会影响结果。


2
在MySQL中,如果你想要一个实际的列,你需要:
  • 创建任何类型的列
  • 通过在theatre表上创建一个触发器来保证它的一致性,该触发器将在每次添加或删除行时更新该列。

2

MySql 5.7版本支持生成列。


相关文档链接:https://dev.mysql.com/doc/refman/8.0/en/create-table-generated-columns.html - houcros
我正在尝试使用JDBC与MySQL交互时,通过MySQL的自动生成列功能。应该显示查询结果的自动生成单元格是可编辑的,而且没有被阻止自动生成,导致出现错误。请告诉我需要对我的代码进行哪些更改,以便该行可以自动填充。此外,由于自动生成功能是在Mysql 5.7中引入的,但我正在使用5.1版本的连接器/驱动程序。这可能会成为问题吗? - Ashish Ramtri

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