我刚刚开始使用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表中创建一个列,它会自动执行上述查询并将值插入每一行。
这将是一个非常小的数据库,所以速度不是真正的问题,我只想学习如何制作这样一个计算列(如果可能的话)。
答案 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
中生成的列