一个外键引用了不同表的两个主键?

时间:2013-05-26 13:27:33

标签: mysql sql

我创建了数据库,其表地址为owner_id,它引用了不同表的两个主键,但出现错误错误“无法更新子行:外来ke约束失败”
这是我表格的结构

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 个答案:

答案 0 :(得分:0)

您的数据结构不太合理。如果您有地址,您怎么知道拥有者是什么?供应商还是客户?解决此问题的一种方法是:

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

即,将值存储在单独的字段中。

解决这个问题的一种更复杂的方法是拥有一个名为“实体”或“组织”的新概念或类似的东西。这将为供应商和客户(以及谁知道,合作伙伴,潜在客户和竞争对手)提供ID。对于供应商来说,id客户真的是EntityId,它们之间是不同的。

我应该补充说,这种数据结构相当罕见。在大多数公司中,客户数据库与供应商数据库是分开的,并且没有单一的合并地址表。您可能会考虑另一种选择,特别是如果供应商倾向于公司而客户往往是个人。组织的地址与个人的地址具有不同的特征。