【问题标题】:ER_FK_NO_INDEX_PARENT: Failed to add the foreign key constraint. Missing index for constraintER_FK_NO_INDEX_PARENT:添加外键约束失败。缺少约束索引
【发布时间】:2020-01-25 12:23:34
【问题描述】:

我确实阅读了大部分其他类似的问题和互联网,但还无法解决。

这就是我所拥有的:

CREATE TABLE IF NOT EXISTS teams(
ID INT NOT NULL AUTO_INCREMENT,
teamname VARCHAR(255),
PRIMARY KEY (ID,teamname)
    )

CREATE TABLE IF NOT EXISTS players(
ID INT NOT NULL AUTO_INCREMENT,
player_name VARCHAR(255),
cm INT NOT NULL,
teamname VARCHAR(255),
PRIMARY KEY (ID),
FOREIGN KEY (teamname) REFERENCES teams(teamname)
    )

完全错误

ER_FK_NO_INDEX_PARENT: Failed to add the foreign key constraint. Missing index for constraint 'players_ibfk_1' in the referenced table 'teams'

两者都是 varchar 并且外键分配正确(我认为是这样) 两个表都是 InnoDB(默认)

【问题讨论】:

  • 您没有团队名称的索引(或团队名称是最左侧节点的复合索引)
  • @N.B.:缺少索引对我来说仍然很困惑,在“找到解决方案”之后还有更多,应用解决方案并理解解决方案,我没有做到。不是所有人

标签: mysql


【解决方案1】:

首先尝试分析和理解您的架构。我看不出为什么teamname 应该是主键的一部分。由于AUTO_INCREMENT 选项,ID 列已经是唯一的。所以你可以把它设为主键。

现在分析teamname 上的约束。如果两个团队不能有相同的名称,那么您应该在teamname 上定义一个UNIQUE KEY 约束。如果每个团队都必须有一个名字,那么你应该在teamname 上定义一个NOT NULL 约束。有了这些约束,teams 可以创建为:

CREATE TABLE IF NOT EXISTS teams (
  ID INT NOT NULL AUTO_INCREMENT,
  teamname VARCHAR(255) NOT NULL,
  PRIMARY KEY (ID),
  UNIQUE KEY (teamname )
);

现在您可以使用teamname 列来标识teams 表中的一行,并且可以将其用作其他表中的外键。您的players 表代码现在应该可以工作了(请参阅demo)。

请注意,通常外键引用另一个表的主键。 players 表将被定义为:

CREATE TABLE IF NOT EXISTS players (
  ID INT NOT NULL AUTO_INCREMENT,
  player_name VARCHAR(255),
  cm INT NOT NULL,
  team_id INT,
  PRIMARY KEY (ID),
  FOREIGN KEY (team_id) REFERENCES teams(ID)
);

当你需要知道一个玩家的队名时,你会使用 JOIN:

SELECT p.*, t.teamname
FROM players p
LEFT JOIN teams t on t.ID = p.team_id

注意:在过去的几天里,我一次又一次地看到具有相同模式的问题。模式是:一个外键,它引用另一个表中主键的一部分。一些例子:

建议在引用表上定义一个简单索引以支持 FK 约束检查的评论和答案。 不要那样做! 考虑一下,如果您尝试通过在 teams 表的 teamname 上定义一个索引来解决您的问题:

CREATE TABLE IF NOT EXISTS teams (
  ID INT NOT NULL AUTO_INCREMENT,
  teamname VARCHAR(255) NOT NULL,
  PRIMARY KEY (ID),
  INDEX (teamname )
);

MySQL 将接受这一点(请参阅demo)。但是您的架构允许两个具有相同名称的团队。假设您有两个名为“monkeys”的团队。并且您有一个以“猴子”作为球队名称(FK)的球员。引用了两个团队中的哪一个?你不能说!所以你最好坚持简单的规则。外键的规则是:只引用完整的 UNIQUE 或 PRIMARY KEYS。甚至更简单:仅引用完整的主键。外键值应标识引用表中的特定行。

【讨论】:

    猜你喜欢
    • 2014-12-07
    • 2019-02-27
    • 2017-09-16
    • 2016-05-23
    • 1970-01-01
    • 2019-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多