我一直在尝试用HeidiSQL建立一个小型数据库,但我偶然发现了一个问题。我想在某个表中添加一列,该列计算包含特定值的另一个表中的列数。我通过设置默认值尝试了它,输入一个看起来像这样的自定义值
SELECT COUNT(LidID) AS AantalSchepen FROM SCHIP WHERE SCHIP.LidID=LID.LidID
而LidID是我想要计算行数的列的名称,在表SCHIP中包含与表LID中相同的值。 LidID的值是表LID的主键,因此逻辑上是表SCHIP中的外键。
但是,当我在自定义默认值字段中输入此语句时,它会告诉我默认值无效。我正在做什么完全不可能,或者我的SQL语句是否有缺陷?
编辑: 数据库的目的是成为网站表格中显示的信息来源。正如我在之前的回复中所读到的,我在这里尝试做的事情根本不可能,所以不同的解决方案是......?
答案 0 :(得分:0)
通常,您无法添加“运行查询”的默认值。这可能取决于数据库,但我想不出支持这个的数据库。
您可以使用视图访问数据:
create view v_lid as
select l.*,
(select count(*)
from SCHIP s
where s.LidID = l.LidID
) as AantalSchepen
from lid l;
然后,当您访问该视图时,您将获得最新值。
注意:这与“默认”值略有不同,“默认”值会在创建行时放入值。如果你真的想要那个,你需要一个触发器。或者,也许有一些日期逻辑会达到相同的值。
答案 1 :(得分:0)
在MySQL 5.7.6和MariaDB 5.2中,表格可以包含虚拟列。 MariaDB称之为虚拟,在MySQL中称为生成。两者的意思相同,语法也非常相似。 HeidiSQL的表编辑器支持创建这样的虚拟列。示例CREATE CODE:
CREATE TABLE table1 (
a INT NOT NULL,
b VARCHAR(32),
c INT AS (a mod 10) VIRTUAL
)
不幸的是,虚拟列不支持子查询,这就是为什么这一切对COUNT(*)
查询没有帮助。