繁体   English   中英

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

[英]Use of Primary Key as Foreign Key in Foreign Key Table

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

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

谢谢!

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

编辑:

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

例

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

通常,您通常不会像这样双向创建外键。 如果这样做,则意味着两个表以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)
);

外键和主键有时是相关的,但并非总是如此。 表中的外键实际上只是意味着“此字段中的任何值都必须在此其他表中--->在这里”。 在另一个表中该值是否为PK无关紧要-它必须存在并且必须唯一。 这可能适合作为主键的账单,但是不需要成为主键。

您可以使用复合外键,例如在(愚蠢的)通讯录中,您可以使用(firstname, lastname)键入您在某个人的电话号码中列出的子表,但这会遇到“确定”的问题,John Smith这样做这个数字属于?”。

在大多数数据库中,外键引用必须是主键或唯一键(并且允许NULL )。 MySQL建议这样做,但不需要

但是,系统不强制要求引用的列为UNIQUE或声明为NOT NULL。 对于诸如UPDATE或DELETE CASCADE之类的操作,未很好地定义对非唯一键或包含NULL值的键的外键引用的处理。 建议您使用仅引用UNIQUE(包括PRIMARY)和NOT NULL键的外键。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM