【问题标题】:Error There are no primary or candidate keys in the referenced table错误 引用的表中没有主键或候选键
【发布时间】:2014-05-22 15:26:09
【问题描述】:

尝试使用外键创建表时出现此错误:

引用表“TeamToPlayers”中没有与外键“FKey2”中的引用列列表匹配的主键或候选键。

不明白为什么,表TeamToPlayers中有一个主键。

这里是查询:

create table TeamToPlayers
(TeamName varchar(50) NOT NULL,
  PlayerName varchar(50) NOT NULL,
  primary key(TeamName,PlayerName),
  CONSTRAINT FKey FOREIGN KEY (TeamName) REFERENCES Teams(TeamName)
)

create table Players
(PlayerName varchar(50) NOT NULL,
primary key(PlayerName),
CONSTRAINT FKey2 FOREIGN KEY (PlayerName) REFERENCES TeamToPlayers(PlayerName)
);

【问题讨论】:

  • 你的 FK 关系倒退了。如果你仔细想想,你就会明白为什么会这样。为了让 Players 引用 TeamToPlayers 中的键,它需要引用具有唯一性约束的整个键。但是,如果 TeamToPlayers 中的 Players 引用 Players 中的键,则整个键就是单个属性。

标签: sql database visual-studio-2012


【解决方案1】:

TeamToPlayers 主键由两个字段组成 - 您必须同时引用这两个字段,否则它不是键。我认为您的密钥可能弄错了 - 它应该在 TeamToPlayers 上并像这样引用 Players

create table TeamToPlayers
(   
    TeamName varchar(50) NOT NULL,
    PlayerName varchar(50) NOT NULL,
    primary key(TeamName,PlayerName),
    CONSTRAINT FKey FOREIGN KEY (TeamName) REFERENCES Teams(TeamName),
    CONSTRAINT FKey2 FOREIGN KEY (PlayerName) REFERENCES Players(PlayerName)
)

create table Players
(PlayerName varchar(50) NOT NULL,
primary key(PlayerName),
);

【讨论】:

  • 不确定我们谁先到了那里。 +1
  • 但我在球员表中没有 TeamName - 我希望 TeamToPlayers 表显示团队中的成员。为什么我需要引用两个字段我只使用一个?
  • 是的,这一切都很好,但是您希望在您的球员表中知道球队中的球员,是吗?这就是为什么您拥有对 Players 的 FK,以便在 TeamToPlayers 中输入的任何玩家必须首先存在于 Players 中。
  • 我认为您尝试使用图形设计工具,您的架构是错误的!直观地看到它可能会对您有所帮助。 (另外,另一个提示:我不会将团队名称用作 PK - 如果将来有人更改团队名称,那会很混乱)。使用身份并在名称上设置唯一约束。不是你问的问题,......只是说。
猜你喜欢
  • 2016-06-08
  • 1970-01-01
  • 1970-01-01
  • 2012-08-26
  • 1970-01-01
  • 2018-12-25
  • 2022-01-07
  • 1970-01-01
相关资源
最近更新 更多