sql - 添加约束以确保两个外键的公共(public)父级

标签 sql postgresql

我在向表添加检查约束时遇到问题。

这是上下文。

  • “Account”和“Category”是两个表,每个表都通过外键与“Budget”表关联,但在其他方面是独立的
  • 表“Operation”通过两个外键与“Account”和“Category”相关

=> 我想确保它们都引用相同的“预算”项,以便:对于每个操作帐户.budget_id == 类别.budget_id。

database diagram of my current situation

如何通过对我的数据库的约束来管理它?或者有没有办法在我的数据库设计中防止这种菱形形状,同时保持帐户和类别独立?


我试过的:

CONSTRAINT category_and_account_are_from_same_budget CHECK
(
    (
        SELECT cat.budget_id FROM operation op INNER JOIN category cat ON (op.category_id=cat.id)
        except
        SELECT acc.budget_id FROM operation op INNER JOIN account acc ON (op.account_id=acc.id)
    ) IS NULL
)

但是

  1. 感觉这不是一种优雅的方式
  2. 无论如何...“错误:不能在检查约束中使用子查询”

感谢您的帮助!

最佳答案

在我看来,最简单的方法是执行以下操作:

  1. budget_id 添加到 operation
  2. 将唯一约束添加到 accountcategory 两列:budget_idid。此约束是多余的,但下一步需要。
  3. 使用 (budget_id, id) 唯一约束在 operation 中定义外键。

这保证了他们的预算是相同的。

有一个替代方案。您可以使用check 约束。但是,这需要编写两个用户定义的函数来为每个 accountcategory 返回 budget_id

关于sql - 添加约束以确保两个外键的公共(public)父级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63882245/

相关文章:

c++ - 如何在 Oracle PRO*C 中按名称绑定(bind)

mysql - 如何通过终端在mysql中连续上传文件的全文

postgresql - Npgsql、TransactionScope 和准备好的事务

database - 在 PostgreSQL 中为给定表创建序列和自动增量字段的语法

mysql - 如何在 mysql 中使用 JOIN 语句实现以下目标?

SQL 多重选择 - 堆叠多个 View 并删除重复项

java - JPA参照完整性约束违反oneToMany和批量操作查询

postgresql - 创建手动输入值的 cte

ruby-on-rails - PG::UndefinedFunction: 错误:运算符不存在:文本 = bool 值

php - pg_escape_string 不工作