2011-04-15 56 views
0

我在oracle中創建了一個表,其中有一個FK引用了3個不同表中的3個主鍵。但是當我想插入它時,我看到一個錯誤,說父鍵沒有找到!做?oracle中的外鍵

CREATE TABLE A 
( X  char(11)  not null, 
    id  char(11)  not null, 
    PRIMARY KEY(X,id), 
    FOREIGN KEY(id) REFERENCES B(employee_id), 
    FOREIGN KEY(id) REFERENCES C(customer_id) 
); 
+1

你在表B和C中插入了與表A中的'id'值相匹配的數據嗎? – 2011-04-15 02:52:48

+0

設計看起來有點不妥。表中的一個字段涉及三個不同的表,強制三個表中存在相同的值作爲主鍵。 – Chandu 2011-04-15 02:54:00

+1

Cyber​​nate是正確的。在兩個不同的表中嘗試使用一個外鍵來設置pkey值是沒有意義的。我很驚訝Oracle甚至會允許創建這些約束條件。 – 2011-04-15 02:59:52

回答

2

創建一個父表(爲了舉例我將稱它爲Party)。參考所有三個表格A,B,C中的派對錶格。結果,多個外鍵將被一個引用Party表的外鍵替換。這是泛化/專業化的一個例子,您將在許多數據建模書中找到「子類型」模式。

3

你在表中的列id指表B中列以及表C.如果你需要在一個表中插入數據的列,在id字段中的值必須在表中的值相匹配B C,否則你打破你的FK約束;這是不可能插入表A的行包含列指的一個unexisting行表B或C.

3

如果你的意圖是,在該ID要麼一個外鍵EMPLOYEE_ID列中的B 列C中的CUSTOMER_ID列的外鍵,您遇到了問題 - 您無法爲這種/或類型關係聲明外鍵。

從數據建模的角度來看,你有幾種選擇

  • 您可以在創建兩列,一EMPLOYEE_ID列,它是一個空的外鍵B中的EMPLOYEE_ID列和CUSTOMER_ID列,它是在C中爲CUSTOMER_ID列的可爲空的外鍵。然後,您可以在A上創建一個檢查約束,即這兩列中的某一個爲NULL。
  • 您可以創建一個新的ENTITY表,其中包含所有的EMPLOYEE_IDCUSTOMER_ID值。 EMPLOYEE_ID在B。將一個外鍵ENTITY_IDENTITY如本CUSTOMER_ID列C和A中的ENTITY_ID
  • 您可以將列單獨的A,消除外鍵。然後你將負責驗證代碼中的參照完整性。這最後一個選項通常不是一個好主意。

一般來說,我也是真的可疑列宣佈爲CHAR(11)。在Oracle中幾乎沒有使用CHAR而不是VARCHAR2的情況。充其量,這是一種洗滌。

+0

我會親自選擇第二個選項。 – 2011-04-15 03:04:01

+0

但是,如果我寫你說我不能說,檢查其他2爲空,因爲它們都是主鍵。你知道我的意思嗎? – SunyGirl 2011-04-15 03:08:22

+1

主鍵不論是否合成,都不能包含空值。按定義鍵不允許空值。 Oracle不允許在符合PRIMARY KEY約束的列中使用空值。 – sqlvogel 2011-04-15 08:43:25