在外键表中使用主键作为外键

时间:2016-10-27 20:32:57

标签: mysql sql foreign-keys schema primary-key

这可能听起来令人困惑或简单,但是......

如果我使用表A中表B的外键,它具有单独的主键。我是否需要将表A的主键作为表B中的外键包含在内?

谢谢!

=============================================== =========================

修改

好的,让我试着澄清一下我的问题。

EXAMPLE

在上面的情况中,应该我在表2中使用Taco_ID作为FK?或者完全没必要吗?

3 个答案:

答案 0 :(得分:1)

通常,您通常不会像这样双向制作外键。如果这样做,则意味着两个表以1:1的关系存在:每个taco都有一个类型,每个taco类型只能由一个玉米卷使用。如果你有这样的关系,没有任何理由将它们放在单独的表中,它们可能只是同一个表中的其他列。

通常,外键用于1对多或多对多关系。 如果许多不同的玉米饼可以是相同类型,那么1对多关系就是这样。它们每个都有Taco_Type_ID个外键。

对于多对多关系,通常使用单独的关系表。

CREATE TABLE Taco_Types (
    Taco_ID INT, -- FK to Table1.Taco_ID
    Taco_Type_ID INT, -- FK to Table2.Taco_Type_ID
    PRIMARY KEY (Taco_ID, Taco_Type_ID)
);

答案 1 :(得分:0)

外键和主键与SOMETIMES相关,但并非总是如此。表中的外键只是意味着"该字段中的任何值都必须存在于另一个表中 - >>这里&#34 ;.该值是否与其他表中的PK无关 - 它只是必须存在,并且必须是唯一的。这可能适合作为主键,但不是必需的。

您可以拥有复合外键,例如在一个(愚蠢的)地址簿中,您列出一个人的电话号码的儿童表可以用(firstname, lastname)键入,但这会遇到问题,好的,约翰史密斯这样做号码属于?"。

答案 2 :(得分:0)

在大多数数据库中,外键引用必须是主键或唯一键(并且允许NULL)。 MySQL recommends this but does not require it

  

但是,系统不强制执行   要求引用的列为UNIQUE或声明为NOT   空值。处理对非唯一键或键的外键引用   对于诸如的操作,没有很好地定义包含NULL值的值   更新或删除CASCADE。建议您使用外键   仅引用UNIQUE(包括PRIMARY)和NOT NULL键。

您是否需要引用外键关系的主键?首先,您甚至不需要声明外键关系。我认为它们很重要,因为它们允许数据库保持参照完整性。但是,它们不是必需的。基于外键的存在,查询中也没有任何语义差异(例如,NATURAL JOIN不使用它们)。优化可以利用声明的关系。

其次,如果要声明外键,我建议使用引用表的主键。毕竟,这是拥有主键的主要原因之一。