使用唯一索引进行跨表约束

时间:2014-06-09 18:54:33

标签: sql oracle

我对Oracle和数据库设计一般都很陌生,但我有一个问题。我有两个基本的表叫做员工和部门。 employee表包含salary属性。现在我需要实施一项新的业务规则:一个部门(员工是部门的一部分)的所有员工工资总额不得超过20万。我知道这可以通过物化视图完成,但也可以使用唯一索引来完成吗?如果是这样,人们将如何处理这种特殊情况?

2 个答案:

答案 0 :(得分:1)

不,您不能使用唯一索引来强制执行此类规则。

您可以尝试通过触发器强制执行此类规则,但在多用户环境中往往会变得相当困难。您需要执行锁定department行的操作,以确保一次只能有一个会话修改特定employee的{​​{1}}信息,这往往会带来显着的可扩展性的问题。它还倾向于涉及相当多的代码来处理所有潜在的情况。

答案 1 :(得分:0)

这不能用任何索引完成。但可以使用触发器来完成。

如果您在maxDeptSalary表格中添加了departments列,那么您可以在InsertUpdate上创建一个触发器

  1. 查询您的maxDeptSalary并获取值
  2. 对该部门的员工表中的现有记录运行Sum
  3. 比较sum + new.value <= maxDeptSalary
  4. 如果不符合条件,则拒绝您的记录
  5. 但实际情况是,这应该在应用程序级别完成,而不是数据库