【问题标题】:Use of Primary Key as Foreign Key in Foreign Key Table在外键表中使用主键作为外键
【发布时间】:2017-03-10 16:14:27
【问题描述】:

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

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

谢谢!

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

编辑:

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

在上述情况下,应该我使用 Taco_ID 作为表 2 中的 FK?还是完全没有必要?

【问题讨论】:

  • 这真的没有意义。如果您在表 2 中有 Taco_ID,则意味着每种 taco 类型只能有一个 taco。

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


【解决方案1】:

一般来说,您通常不会像那样双向创建外键。如果这样做,则表示这两个表是一对一的关系:每个 taco 都有一个类型,每个 taco 类型只能被一个 taco 使用。如果您有这样的关系,则没有任何理由将它们放在单独的表中,它们可能只是同一个表中的附加列。

通常外键用于一对多或多对多关系。 如果许多不同的炸玉米饼可以属于同一类型,则一对多的关系将是。它们每个都有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)
);

【讨论】:

    【解决方案2】:

    在大多数数据库中,外键引用必须指向主键或唯一键(允许使用 NULLs)。 MySQL recommends this but does not require it:

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

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

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

    【讨论】:

    • 这并没有真正回答他的问题,他在您发布后澄清了这个问题。他的问题是你是否需要在两个方向都有外键。
    【解决方案3】:

    外键和主键有时是相关的,但并非总是如此。表中的外键字面意思只是“此字段中的任何值都必须存在于 ---> 此处的另一个表中”。该值是否是另一个表中的 PK 无关紧要 - 它必须存在,并且必须是唯一的。这可能符合作为主键的要求,但不需要作为主键。

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

    【讨论】:

    • 他在你发帖后澄清了这个问题。他的问题是你是否应该在两个表之间有两个方向的外键。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-30
    • 1970-01-01
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    • 2013-04-21
    • 2013-05-12
    相关资源
    最近更新 更多