我有两张桌子
Department
Professor
其中Department
有一个名为HeadID
的属性引用Professor
Professor
有一个名为DeptID
的属性,引用Department
他们形成了循环关系。
但问题是,如何在任何这些表中插入一行?
在我尝试插入一行后,Oracle抱怨“找不到父密钥”。
答案 0 :(得分:11)
您可以将其中一个外键约束定义为DEFERRABLE,并将约束检查延迟到事务结束(而不是在语句结尾处检查,以“未找到父键”结束)。阅读here
答案 1 :(得分:1)
此处描述的其他解决方案更简单
但是如果你真的希望数据库描述你的商业(这不一定是最好的方法)那么你可以有另一个表,让我们说DEPT_HEAD_POSITIONS
。 Department
表将使用FK(HeadID)引用此表,Professor
表将另一个可空字段作为此新表的FK。
现在,你拥有的是:
答案 2 :(得分:0)
根据SQL-92标准,由多列组成的外键可以允许其中一列包含在引用列中没有匹配值的值。要避免这种情况,请在所有外键列上创建NOT NULL约束
所以我认为您可以在其中一行中插入数据而不在外键列中给出值,然后在第一个表中将行插入第二行引用主键值,然后您可以继续......
答案 3 :(得分:0)
如果您有权重新设计架构,则应该这样做。如果不是,我认为最简单,最好的方法在deathApril的评论中有所描述。
在你想要添加一个新部门和一个新任教授的用例中,你最好:
答案 4 :(得分:-1)
Oracle和SQL Server不允许循环引用,因为从具有依赖关系的表中删除一行时,从另一个表(外键)引用被删除的行时,总是存在问题..... 有关详细信息:Click here