2017-04-01 68 views
0

假设我有在MySQL 两个表1.Child(姓名,father_name) 2.Father(姓名,联系方式)为什么mysql允许外键引用复合主键的一部分?

表父亲有一个复合键(姓名,联系方式).Father_name在子表引用名在父亲。因此一个外键引用了主键的一部分。这是mysql允许的。

但是考虑以下情况:

表父亲有下列元组:

(kishan,9906011111) 
(kishan,99906) 

现在假设我在孩子中插入一行

(xyz,kishan) 

我怎么知道哪个基尚在父表是与xyz有关的孩子吗?

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

请回答这个方案允许mysql的好处是什么?

+0

因为有可能* * foreign *键映射到值列表**。 –

回答

0

这是MySQL的一个特点。在我看来,外键只能是唯一的键或主键。不应使用外键关系映射到“设置”值。很显然,MySQL的设计者不同意(与我和其他数据库实现者一样)。它们允许外键关系到索引的任何列 - 按照MySQL的说法,被定义为“键”。如果你有一个组合主键,那么最初的列就是这样一个键。

为了防止出现问题,让你的表格明确的,易于使用的,我会建议:

  • 所有表有一个自动递增的主键。
  • 所有的外键关系是只有主键(不是唯一的键或其他类型的键)。
  • 主键被命名为实体的单数,后面跟着id(例如:thingsthingId作为主键)。
  • 外键具有与主键相同的名称(除非由于存在多个到同一个表的外键关系而无法实现)。