【问题标题】:Creating a very specific column in HeidiSQL在 HeidiSQL 中创建一个非常具体的列
【发布时间】:2015-04-24 12:27:07
【问题描述】:

我一直在尝试使用 HeidiSQL 建立一个小型数据库,但我偶然发现了一个问题。我想在某个表中添加一个列,该列计算另一个表中包含某个值的列的数量。我已经通过设置默认值进行了尝试,输入一个看起来像这样的自定义值

    SELECT COUNT(LidID) AS AantalSchepen FROM SCHIP WHERE SCHIP.LidID=LID.LidID

而 LidID 是我要计算行数的列的名称,它在表 SCHIP 中包含与表 LID 中相同的值。 LidID 的值是表 LID 的主键,因此逻辑上是表 SCHIP 的外键。

但是,当我在自定义默认值字段中输入此语句时,它告诉我默认值无效。我正在做的事情是完全不可能的,还是我的 SQL 语句有缺陷?

编辑: 数据库的目的是成为网站表格中显示的信息来源。正如我在之前的回复中所读到的,我在这里尝试做的事情根本不可能,所以不同的解决方案是......?

【问题讨论】:

  • 你不是说“计算行数”吗?
  • 如果你的意思是行,那么我猜你错过了 GROUP BY 语句
  • 只计算一个 id 的行数时不需要 GROUP BY。
  • @jarlh 是的,我想这就是我的意思,英语不是我的母语,所以我可能在帖子中搞砸了一些语法,将对其进行编辑。
  • @Asped 我只是列出包含等于我选择的值的行数,而不是列出所有不同的值及其相应的实例数量。

标签: sql heidisql


【解决方案1】:

通常,您不能添加“运行查询”的默认值。这可能取决于数据库,但我想不出支持这个的数据库。

您可以做的是使用视图访问数据:

create view v_lid as
    select l.*,
           (select count(*)
            from SCHIP s
            where s.LidID = l.LidID
           ) as AantalSchepen
    from lid l;

然后,当您访问视图时,您将获得 latest 值。

注意:这与“默认”值有点不同,默认值会在创建行时放入该值。如果你真的想要那样,你将需要一个触发器。或者,也许有一些日期逻辑会达到相同的值。

【讨论】:

  • hmmm 好的,让我在主线程中详细说明行的用途,第二。
【解决方案2】:

在 MySQL 5.7.6 和 MariaDB 5.2 以上,一个表可以有 virtual 列。 MariaDB 将其称为virtual,在 MySQL 中称为generated。两者含义相同,语法也非常相似。 HeidiSQL 的表格编辑器支持创建这样的虚拟列。示例创建代码:

CREATE TABLE table1 (
 a INT NOT NULL,
 b VARCHAR(32),
 c INT AS (a mod 10) VIRTUAL
)

不幸的是,虚拟列不支持子查询,这就是为什么这对COUNT(*) 查询没有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-16
    • 2016-11-08
    • 2018-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多