[英]Use of Primary Key as Foreign Key in Foreign Key Table
通常,您通常不会像这样双向创建外键。 如果这样做,则意味着两个表以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.