两个表相互引用:如何在Oracle数据库中插入行?

7

我有两个表:

  1. Department
  2. Professor

其中 Department 有一个名为 HeadID 的属性,引用了 Professor, 而 Professor 有一个名为 DeptID 的属性,引用了 Department

它们构成了一个循环关系。

但问题是:如何向这些表中的任意一个插入一行数据?

在我尝试插入一行数据后,Oracle 报错 "parent key not found"。


如果headid在部门中可以为空,首先插入部门,然后插入教授,最后更新部门... - Aprillion
Department表中的HeadIDProfessor表中的DeptID均为NOT NULL - sc1013
1
嗯...你可以使用已经存在的教授为新部门提供服务,然后再替换他们。 - Aprillion
5个回答

11
你可以将其中一条外键约束定义为DEFERRABLE,并推迟约束检查直到您的事务结束(而不是在以“找不到父键”结尾的语句结束时进行检查)。 在此处阅读:这里

如果那个设计确实必要,那么可延迟约束就是正确的方式(尽管我可能会使两个约束都是可延迟的)。 - user330315

1

这里描述的其他解决方案更简单。
但是,如果您真的希望DB描述您的业务(这不一定是最佳方法),那么您可以拥有另一个表,比如DEPT_HEAD_POSITIONSDepartment表将具有FK(HeadID)引用此表,而Professor表将具有另一个可空字段作为对此新表的FK。

现在,您拥有的是:

  • 部门负责人职位
  • 部门(必须有一个负责人职位)
  • 教授(必须属于某个部门,并且可能是该部门的负责人)

0

根据SQL-92标准,由多个列组成的外键可以允许其中一个列包含没有匹配值的情况。为了避免这种情况,在所有外键列上创建NOT NULL约束。

供参考

因此,我认为您可以在其中一行中插入数据,而不必在外键列中提供值,然后在第二个表中引用第一个表中主键的值插入行,然后您可以继续进行...


0

如果您有重新设计模式的权限,那么您应该这样做。如果没有,我认为最简单和最好的方法是在deathApril的评论中描述的。

在您想要添加一个新部门和一个新教授来领导它的用例中,您最好:

  1. 将教授添加到另一个部门
  2. 添加以步骤1中的教授为负责人的部门
  3. 更新步骤1中的教授记录,以引用在步骤2中创建的他的新部门

-1

Oracle和SQL Server不允许循环引用,因为当从一个表中删除具有对另一个表中的另一行(外键)的依赖关系的行时(引用正在被删除的行),总会出现问题...... 更多信息:点击这里


不适用于Oracle。您可以将约束定义为可延迟的(请参见Marcin的答案)。 - user330315

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接