【问题标题】:PostgreSQL, Calculating Number Of Drivers?PostgreSQL,计算驱动程序的数量?
【发布时间】:2014-12-21 07:19:04
【问题描述】:

我为一家出租车公司实施了一个数据库。我已经使用 PostgreSQL 创建了这个数据库。我有 4 个实体客户、公司、司机和预订。目前,我很难找到一种方法来计算某家公司有多少司机。

在驱动程序实体中使用了一个外键,即“firmid”。 “firmid”创建一个链接,告诉数据库某个驱动程序属于某个公司。

在公司表中,我有一列名为“驱动程序编号”。目前,我必须从驱动程序实体手动计算属于特定公司的驱动程序数量,并将整数输入到公司实体的列中。有没有我可以实现的任何类型的公式或某些功能可以自动化这个过程。

例如,如果我要从驱动程序实体中删除驱动程序,则特定记录的公司实体中的驱动程序数量应该减少,反之亦然以添加驱动程序。

这个问题已经困扰了我一个星期了。

2014 年 12 月 20 日更新

我尝试添加一个约束来检查驱动程序的数量:

ALTER TABLE firm ADD CONSTRAINT numberofdrivers_check CHECK (driversno ~ (SELECT COUNT (*) AS drivers FROM driver d GROUP by d.firmno ORDER BY 01));

但我收到以下错误:

ERROR:  operator does not exist: bigint ~ bigint
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.

有什么想法吗?

【问题讨论】:

  • 在您更改驱动程序列表时使用触发器更新“公司”表中的计数。
  • 使用视图。这就是它们的用途。
  • 这很简单。但是您应该使用 sqlfiddle.com 来演示您的表格。
  • @MarcB 触发器是什么意思?我应该添加约束吗?
  • CHECK 有不同的含义。您对它的使用看起来像是来自其他语言。 driversno 不能在这样的表达式中定义。

标签: sql database postgresql rdbms


【解决方案1】:

我建议不要在数据库中存储这样的聚合值。只需在需要时计算即可。

SELECT d.Firm_ID, count(*) AS Driver_Count
    FROM Drivers d
    GROUP BY d.Firm_ID

【讨论】:

  • 可行,但公司希望存储驱动程序的数量。有没有办法自动计算表中的值而不是使用选择查询?
  • @MohammedSohaib 简短的回答是否定的,postgres 故意不存储表中的确切 行数。这是为了便于在多用户多连接环境中进行操作,其中必须在每个操作上锁定表,以便更改魔法总数。让我回应上面的建议,使用 VIEW,其中 Joe 的计数用于计算驱动程序总数。除非你让公司看到你工作的内部结构,否则VIEW 应该看起来足够像外部世界的桌子,其他一切都可以正常工作。
猜你喜欢
  • 2013-10-25
  • 1970-01-01
  • 2018-05-16
  • 1970-01-01
  • 1970-01-01
  • 2011-09-01
  • 1970-01-01
  • 2012-12-01
  • 1970-01-01
相关资源
最近更新 更多