2013-05-26 159 views
2

我創建了數據庫的表地址擁有owner_id引用到不同表的兩個主鍵,但給出錯誤錯誤「無法更新子行:外部約束失敗」
這是我的表的結構一個外鍵引用不同表的兩個主鍵?

CREATE TABLE Address 
(
OwnerID VARCHAR(5) NOT NULL, 
Line1 VARCHAR(40), 
City VARCHAR(40), 
Postcode VARCHAR(4), 
AddressType INT, 
PRIMARY KEY (OwnerID, AddressType), 
FOREIGN KEY (AddressType) REFERENCES AddressType(AddressType), 
FOREIGN KEY (OwnerID) REFERENCES Supplier(SupplierID), 
FOREIGN KEY (OwnerID) REFERENCES Customer(CustomerID) 
); 

任何人都可以解決?或至少給我一個替代?

+1

特定地址的所有者如何能夠同時成爲供應商和客戶? – eggyal

+0

當你遇到錯誤時,你正在執行什麼查詢? – rtcherry

+1

此外,你應該真的改變架構有一個'AddressID'而不是'OwnerID',然後讓'Supplier'和'Customer'表具有'Address'表中的'AddressID'的外鍵引用。供應商和客戶有地址。地址沒有供應商或客戶。 – rtcherry

回答

0

你的數據結構不太合理。如果你有地址,你怎麼知道業主是什麼?供應商還是客戶?解決此問題的一種方法是:

OwnerOrCustomer char(1) not null, /* has values O or C */ 
OwnerId int, 
CustomerId int, 

即,將值存儲在單獨的字段中。

解決這個問題的更復雜的方法是有一個新的概念,稱爲「實體」或「組織」或類似的東西。這將爲供應商和客戶(以及知道的合作伙伴和潛在客戶以及競爭對手)提供一個ID。供應商的id客戶將真的是一個EntityId,它們之間不同。

我應該補充一點,這樣的數據結構相當罕見。在大多數公司中,客戶數據庫與供應商數據庫相當分離,並且沒有單一的綜合地址表。你可能會認爲這是另一種選擇,特別是如果供應商傾向於是公司,而顧客往往是個人。組織的地址與個人地址具有不同的特徵。

+0

Gordon - Thanx你的回答對我來說似乎很好,我會試試這個。 –

+1

請標記爲答案 – user3340627

相關問題