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

时间:2012-03-25 09:36:17

标签: sql oracle

我有两张桌子

  1. Department
  2. Professor
  3. 其中Department有一个名为HeadID的属性引用Professor Professor有一个名为DeptID的属性,引用Department

    他们形成了循环关系。

    但问题是,如何在任何这些表中插入一行?

    在我尝试插入一行后,Oracle抱怨“找不到父密钥”。

5 个答案:

答案 0 :(得分:11)

您可以将其中一个外键约束定义为DEFERRABLE,并将约束检查延迟到事务结束(而不是在语句结尾处检查,以“未找到父键”结束)。阅读here

答案 1 :(得分:1)

此处描述的其他解决方案更简单 但是如果你真的希望数据库描述你的商业(这不一定是最好的方法)那么你可以有另一个表,让我们说DEPT_HEAD_POSITIONSDepartment表将使用FK(HeadID)引用此表,Professor表将另一个可空字段作为此新表的FK。

现在,你拥有的是:

  • 部门主管职位
  • 部门(必须有头位)
  • 教授(必须属于某个部门且可能担任部门主管)

答案 2 :(得分:0)

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

for reference

所以我认为您可以在其中一行中插入数据而不在外键列中给出值,然后在第一个表中将行插入第二行引用主键值,然后您可以继续......

答案 3 :(得分:0)

如果您有权重新设计架构,则应该这样做。如果不是,我认为最简单,最好的方法在deathApril的评论中有所描述。

在你想要添加一个新部门和一个新任教授的用例中,你最好:

  1. 在不同的部门添加教授
  2. 以第1步的教授为主任加入部门
  3. 更新步骤1中的教授记录,以参考他在步骤2中创建的新部门

答案 4 :(得分:-1)

Oracle和SQL Server不允许循环引用,因为从具有依赖关系的表中删除一行时,从另一个表(外键)引用被删除的行时,总是存在问题..... 有关详细信息:Click here