2012-07-11 49 views
1

假設有兩個表格,Company和Employee。員工對公司有一個外鍵,公司對員工有一個外鍵。我應該如何向這些表中插入和刪除數據而不會發生引用完整性錯誤?雙向外鍵設計

COMPANIES 
ID 
NAME 
CONTACT_EMPLOYEE_ID --FK 

EMPLOYEES 
ID 
NAME 
COMPANY_ID --FK 

我想這是一個相當普遍的問題。我已經研究過它,但一直無法找到很多信息。也許問題出現在我不知道的更常見的名字下。

回答

4

有幾種方法可供選擇:

  1. 是在CONTACT_EMPLOYEE_ID列可空?如果是,只需插入公司,插入員工,然後更新公司記錄。

  2. 您還可以將其中一個約束設置爲可推遲。然後,您可以將約束設置爲延遲,插入兩個記錄然後提交。

1

一般有兩種策略:

  • 離開的FKS爲空的(然後插入NULL到該表中,插入行等表最後更新NULL)之一。
  • Defer其中一個FK。

你甚至可以離開 FKS爲空的或延遲的(甚至是兩者的結合),這樣你就可以執行在兩個方向上插入。

您也可以考慮將所有僱員字段放入公司。

從已經取得的其他建議,這是很好的(使FK列的一個空,或使FK約束可延遲)
0

除此之外,另外一個是使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。