【问题标题】:Why does mysql allow a foreign key to refer a part of composite primary key?为什么mysql允许外键引用复合主键的一部分?
【发布时间】:2017-04-01 21:44:21
【问题描述】:

假设我在 mysql 中有两个表 1.孩子(姓名,父亲姓名) 2.父亲(姓名、联系方式)

Father 表有一个复合键 (name,contact)。Child 表中的Father_name 引用了father 中的名称。因此,外键引用了主键的一部分。这是 mysql 允许的。

但是考虑以下情况:

表父有以下元组:

(kishan,9906011111)
(kishan,9990601234)

现在假设我在 child 中插入一行

(xyz,kishan)

我怎么知道父亲表中的哪个 kishan 与孩子 xyz 相关?

如果 mysql 不允许外键引用主键的一部分,则可以避免这种情况。

请回答mysql允许这种方案有什么好处?

【问题讨论】:

  • 因为 foreign 键可能映射到 list 值。

标签: mysql database


【解决方案1】:

这是 MySQL 的一个特性。在我看来,外键应该只是唯一键或主键。不应使用外键关系映射到值的“集合”。

显然,MySQL 的设计者不同意(包括我和其他数据库实现者)。它们允许与被索引的任何列的外键关系——用 MySQL 的说法,被定义为“键”。如果您有复合主键,那么初始列就是这样的键。

为了防止出现问题并使您的表格明确且易于使用,我建议:

  • 所有表都有一个自动递增的主键。
  • 所有外键关系与主键(不与唯一键或其他类型的键)。
  • 主键命名为实体的单数形式,后跟id(例如:thingsthingId 作为主键)。
  • 外键与主键同名(除非因为同一个表有多个外键关系而无法这样做)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多