2014-02-27 170 views
6

this两个主键

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

LotDetails表I需要BrandName作为外键。这听起来很荒谬,我可以做任何

  1. 一个主键OR
  2. 复合键
  3. ,将被用作外键

我知道,我可以使用BrandNo为外键和显示名优产品,但对知识的缘故(是EASE ofcourse)我想知道,

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

EDITTED

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

+1

在mysql(innodb)中,您可以创建对任何其他(索引)列的引用。在这种情况下,只需为它们创建一个唯一的索引。 – zerkms

+2

是的,你可以使用表的任何_index_作为外键,它不一定是主键。它必须是一个索引列。它也不需要是一个唯一的密钥,但在大多数情况下,一个独特的会更适合于常规索引。 – Wrikken

+0

供参考:正确的拼写是*供应商*。 – wallyk

回答

2

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

按照约定,为了简单易用,通常只选择一个用于外键引用的表中的一个键。通常(并非总是)这是指定为“主要”键的那个键,但不一定如此,除非您找到一个很好的理由否则。

+0

几乎所有人都给出了同样正确的答案。这个答案是更容易理解的,它的工作。将(BrandName)属性创建为Unique并将其用作FK。谢谢 –

0

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

相反,你应该有一个Brands表有主键(也许BrandId,或许BrandName - 我更喜欢前者)。然后需要关于品牌信息的表格可以直接引用该表格。

+1

我读到它的方式我认为重点在于BrandName已经打算成为一个关键,而不是供应商表中的组合的一部分。 – sqlvogel

3

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

听起来有点奇怪,但你可以建立一个关系表AB,它保存IdA,IdB和tableA和tableB引用tableAB各自的列。

btw:一张桌子不需要拥有一个PK,但不能存在两个PK。一般来说,表格是由PK物理排序的。