假设有两个表格,Company和Employee。员工对公司有一个外键,公司对员工有一个外键。我应该如何向这些表中插入和删除数据而不会发生引用完整性错误?双向外键设计
COMPANIES
ID
NAME
CONTACT_EMPLOYEE_ID --FK
EMPLOYEES
ID
NAME
COMPANY_ID --FK
我想这是一个相当普遍的问题。我已经研究过它,但一直无法找到很多信息。也许问题出现在我不知道的更常见的名字下。
假设有两个表格,Company和Employee。员工对公司有一个外键,公司对员工有一个外键。我应该如何向这些表中插入和删除数据而不会发生引用完整性错误?双向外键设计
COMPANIES
ID
NAME
CONTACT_EMPLOYEE_ID --FK
EMPLOYEES
ID
NAME
COMPANY_ID --FK
我想这是一个相当普遍的问题。我已经研究过它,但一直无法找到很多信息。也许问题出现在我不知道的更常见的名字下。
有几种方法可供选择:
是在CONTACT_EMPLOYEE_ID
列可空?如果是,只需插入公司,插入员工,然后更新公司记录。
您还可以将其中一个约束设置为可推迟。然后,您可以将约束设置为延迟,插入两个记录然后提交。
一般有两种策略:
你甚至可以离开都 FKS为空的或延迟的(甚至是两者的结合),这样你就可以执行在两个方向上插入。
您也可以考虑将所有雇员字段放入公司。
从已经取得的其他建议,这是很好的(使FK列的一个空,或使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。