双向外键设计

时间:2012-07-11 09:32:10

标签: oracle database-design

假设有两个表,Company和Employee。员工拥有公司的外键,公司拥有员工的外键。如何在不获取参照完整性错误的情况下将数据插入和删除到这些表中?

COMPANIES
 ID
 NAME
 CONTACT_EMPLOYEE_ID --FK

EMPLOYEES
 ID
 NAME
 COMPANY_ID --FK

我想这是一个相当普遍的问题。我已经研究过但却找不到太多信息。也许问题出现在一个我不知道的更常见的名称下。

3 个答案:

答案 0 :(得分:4)

有几种方法可供选择:

  1. CONTACT_EMPLOYEE_ID列是否可以为空?如果是,只需插入公司,插入员工,然后更新公司记录。

  2. 您还可以将其中一个约束设置为可延迟。然后,您可以将约束设置为延迟,插入两个记录然后提交。

答案 1 :(得分:1)

通常有两种策略:

  • 将其中一个FK保留为NULL(然后在该表中插入NULL,将行插入到其他表中,最后更新NULL)。
  • Defer其中一个FK。

您甚至可以将两个 FK保持为空或可延迟(或者甚至是两者的组合),这样您就可以在两个方向上执行插入。

您还可以考虑将所有EMPLOYEES字段放入公司。

答案 2 :(得分:0)

除了已经提出的其他建议,这些建议是好的(使其中一个FK列为NULL,或使FK约束可延迟),另一个建议是使NOT NULL约束可延迟,例如:

create table COMPANIES (
 ID number not null,
 NAME varchar2(100) not null,
 CONTACT_EMPLOYEE_ID number,
 constraint contact_not_null
   check (CONTACT_EMPLOYEE_ID not null)
   deferrable
   initially deferred
);

现在,您可以为员工ID插入一行NULL,插入员工,然后使用新员工ID更新companies.contact_employee_id,然后执行COMMIT。