MySQL:计算列

时间:2011-03-24 16:58:51

标签: mysql sql database

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

在我的数据库中,我目前有两张桌子,电影院和剧院。 我正在尝试在Cinemas表中创建一个“#The theatre#”,用Cinema图表中的Cinema ID(外键)计算Theatres表中剧院的数量。我让它作为一个SQL查询:

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

但是想知道是否可以在Cinemas表中创建一个列,它会自动执行上述查询并将值插入每一行。

这将是一个非常小的数据库,所以速度不是真正的问题,我只想学习如何制作这样一个计算列(如果可能的话)。

4 个答案:

答案 0 :(得分:11)

计算列通常表示每行可以计算的值。 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,你最接近的是一个定期填充表格的cronjob:

truncate table Table1Summary;
insert Table1Summary (a, Cnt) select a, count(*) from Table1;

您可以像物化视图一样查询表格;它会一样快,但不能保证是最新的。

答案 1 :(得分:4)

有可能。但你不应该这样做。

这称为非规范化 - 通常不是一个好主意。

然而,有时候,你可能绝对需要因为一些奇怪的原因而对某些东西进行非规范化(你的例子远非一个充分的理由)。在这些情况下,您需要添加触发器代码,以便在系统中发生任何可能影响结果的更改时自动管理值。

答案 2 :(得分:2)

在mysql中,如果你想要一个实际的列,你将

  • 将其创建为任何列
  • 通过在影院桌面上创建一个触发器来确保它是一致的,该触发器会在添加或删除行时更新列

答案 3 :(得分:0)

MySql确实支持5.7

中生成的列