Oracle 双向外键设计

Oracle 双向外键设计,oracle,database-design,Oracle,Database Design,假设有两张桌子,公司和员工。员工拥有公司的外键,公司拥有员工的外键。如何在不出现引用完整性错误的情况下将数据插入和删除到这些表中 COMPANIES ID NAME CONTACT_EMPLOYEE_ID --FK EMPLOYEES ID NAME COMPANY_ID --FK 我想这是一个相当普遍的问题。我已经研究过了,但是找不到太多的信息。也许这个问题属于一个我不知道的更常见的名称。有几种方法可用: 联系人\员工\ ID列是否可以为空?如果是,只需插入公司,插入员工,然后

假设有两张桌子,公司和员工。员工拥有公司的外键,公司拥有员工的外键。如何在不出现引用完整性错误的情况下将数据插入和删除到这些表中

COMPANIES
 ID
 NAME
 CONTACT_EMPLOYEE_ID --FK

EMPLOYEES
 ID
 NAME
 COMPANY_ID --FK

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

有几种方法可用:

联系人\员工\ ID列是否可以为空?如果是,只需插入公司,插入员工,然后更新公司记录

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


有几种方法可用:

联系人\员工\ ID列是否可以为空?如果是,只需插入公司,插入员工,然后更新公司记录

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


通常有两种策略:

将其中一个FKs保留为NULL,然后将NULL插入该表,将行插入另一个表,最后更新NULL。 其中一个FK。 您甚至可以将这两个FK都保留为NULL,使其可以为NULL,也可以为NULL,甚至是两者的组合,以便可以在两个方向上执行插入


你也可以考虑把所有的员工领域放在公司中。

通常有2种策略:

将其中一个FKs保留为NULL,然后将NULL插入该表,将行插入另一个表,最后更新NULL。 其中一个FK。 您甚至可以将这两个FK都保留为NULL,使其可以为NULL,也可以为NULL,甚至是两者的组合,以便可以在两个方向上执行插入


您也可以考虑将所有的雇员字段放入公司。

< P>除了已经提出的其他建议,这些建议可以使FK列中的一个无效,或者使FK约束可延迟,另一个是使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插入一个空的行,插入员工,然后更新公司。使用新员工id与员工id联系,然后提交。

除了已经提出的其他建议之外,这些建议很好,可以使FK列之一为空,或使FK约束延迟,另一个是使NOTNULL约束可延迟,例如:

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插入一个空的行,插入员工,然后更新公司。使用新的员工id联系员工id,然后提交