两个主键

时间:2014-02-27 20:44:05

标签: mysql sql sqlite

this

这是我的部分数据库的图形表示。 BrandNoSuppliar表中的主键,在其他表中用作外键。

LotDetails表中我需要BrandName作为外键。这听起来很荒谬,因为我可以做到

  1. 单个主键 OR
  2. 复合键
  3. 将用作外键。

    我知道我可以使用BrandNo作为外键并显示BrandName,但是为了知识(并且是EASE ofcourse)我想知道

    是否可以在不同的表中分别使用表的两个属性作为外键?

    EDITTED

    BrandNo只是一个序列号,品牌名称可以是任何品牌的名称。 如图所示,4个表中需要BrandNo,而只有一个表需要BrandName。 谢谢!

3 个答案:

答案 0 :(得分:3)

是的! FK不需要引用PK,你甚至不需要引用索引列,但为了关系完整性(和健全性),你必须引用一个唯一值列(这就是为什么我们“喜欢”引用PK或至少一个唯一的非聚集索引列。)

这听起来有点奇怪,但您可以构建一个关系表AB,其中包含IdA,IdB和tableA以及引用tableAB各列的tableB。

顺便说一句:一张桌子不需要拥有PK但不能存在两个PK。一般来说,这个表是按PK物理排序的。

答案 1 :(得分:2)

是的,这很有可能。假设BrandName本身就是候选键,那么原则上你可以像BrandNo一样引用它。在这种情况下,BrandName和BrandNo不会是复合键,它们都是单独的候选键

按照惯例,为了简单和易于使用,通常每个表只选择一个密钥用于外键引用。通常(并非总是)指定为“主要”密钥的密钥,但如果您找到合理的理由,则不一定如此。

答案 2 :(得分:0)

创建外键引用时,引用表中的键应为主键。有一个“部分”引用是没有意义的。

相反,您应该有一个Brands表,其中包含一个主键(可能是BrandId,也许是BrandName - 我更喜欢前者。然后需要有关品牌信息的表格可以直接参考此表格。