为什么mysql允许外键引用复合主键的一部分?

时间:2017-04-01 13:35:54

标签: mysql database

假设我在mysql中有两个表 1.Child(姓名,father_name) 2.Father(姓名,联系)

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

但请考虑以下情况:

表父有以下元组:

(kishan,9906011111)
(kishan,9990601234)

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

(xyz,kishan)

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

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

请回答mysql允许的这种方案的好处?

1 个答案:

答案 0 :(得分:0)

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

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

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

  • 所有表都有一个自动递增的主键。
  • 所有外键关系到主键(而不是唯一键或其他类型的键)。
  • 主键被命名为实体的单数,后跟 protected Void doInBackground(Void...params) { //Settimg max priority Thread.currentThread().setPriority(Thread.MAX_PRIORITY); for (int i = 0; i < scheduleList.size(); i++) { ScheduleImpl scheduleImpl = new ScheduleImpl(); //Making network call to get data using token scheduleImpl.getData(scheduleList(i)); } } (例如:idthings作为主键。
  • 外键与主键同名(除非因为同一个表存在多个外键关系而无法执行此操作)。