假设有两个表,Company 和 Employee。Employee 有一个 Company 的外键,Company 有一个 Employee 的外键。我应该如何在这些表中插入和删除数据而不会出现参照完整性错误?
COMPANIES
ID
NAME
CONTACT_EMPLOYEE_ID --FK
EMPLOYEES
ID
NAME
COMPANY_ID --FK
我想这是一个相当普遍的问题。我已经对其进行了研究,但找不到太多信息。也许问题来自一个我不知道的更常见的名称。
假设有两个表,Company 和 Employee。Employee 有一个 Company 的外键,Company 有一个 Employee 的外键。我应该如何在这些表中插入和删除数据而不会出现参照完整性错误?
COMPANIES
ID
NAME
CONTACT_EMPLOYEE_ID --FK
EMPLOYEES
ID
NAME
COMPANY_ID --FK
我想这是一个相当普遍的问题。我已经对其进行了研究,但找不到太多信息。也许问题来自一个我不知道的更常见的名称。
有几种方法可用:
该CONTACT_EMPLOYEE_ID列是否可以为空?如果是,只需插入公司,插入员工,然后更新公司记录。
您还可以将其中一个约束设置为可延迟。然后,您可以将约束设置为延迟,插入两条记录,然后提交。
一般有2种策略:
您甚至可以将两个FK 保留为 NULL 或可延迟(甚至两者的组合),因此您可以在两个方向上执行插入。
您还可以考虑将所有 EMPLOYEES 字段放入 COMPANIES。
除了已经提出的其他建议(使 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,然后提交。