我在向表添加检查约束时遇到问题。
这是上下文。
- “Account”和“Category”是两个表,每个表都通过外键与“Budget”表关联,但在其他方面是独立的
- 表“Operation”通过两个外键与“Account”和“Category”相关
=> 我想确保它们都引用相同的“预算”项,以便:对于每个操作,帐户.budget_id == 类别.budget_id。
如何通过对我的数据库的约束来管理它?或者有没有办法在我的数据库设计中防止这种菱形形状,同时保持帐户和类别独立?
我试过的:
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
)
但是
- 感觉这不是一种优雅的方式
- 无论如何...“错误:不能在检查约束中使用子查询”
感谢您的帮助!
最佳答案
在我看来,最简单的方法是执行以下操作:
- 将
budget_id
添加到operation
。 - 将唯一约束添加到
account
和category
两列:budget_id
和id
。此约束是多余的,但下一步需要。 - 使用
(budget_id, id)
唯一约束在operation
中定义外键。
这保证了他们的预算是相同的。
有一个替代方案。您可以使用check
约束。但是,这需要编写两个用户定义的函数来为每个 account
和 category
返回 budget_id
。
关于sql - 添加约束以确保两个外键的公共(public)父级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63882245/