假設有兩個表格,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。