添加外键约束时出错

Posted

技术标签:

【中文标题】添加外键约束时出错【英文标题】:Error adding Foreign Key Constraint 【发布时间】:2015-07-17 16:24:23 【问题描述】:

我正在尝试添加外键约束,但无法弄清楚我做错了什么。提前感谢您的任何建议。

使用 MyTestDB ALTER TABLE 播放器 添加约束 FK_Player_Team 外键(Team_Name,Team_Location) 参考团队(团队名称,团队位置)

消息 1776,第 16 级,状态 0,第 8 行 引用表“TEAM”中没有与外键“FK_Player_Team”中的引用列列表匹配的主键或候选键。 消息 1750,第 16 级,状态 0,第 8 行 无法创建约束。查看以前的错误。

【问题讨论】:

我建议您的团队主键有问题。为什么不能在给定位置有两个同名的团队?他们可能在不同的部门。还有,到处抄队也是有问题的,队名变了怎么办?一般来说,您似乎缺乏适当规范化的必要表格。我认为您至少需要会议、分区、体育场、州的桌子。否则,您只会不断重复信息。此外,所有内容的 varchar(50) 似乎都关闭了。例如,为什么不声明为 char(2)。 您的 ALTER TABLE 语句应该根据您显示的图像工作,这让我认为它们目前不准确。刷新表的 SSMS 视图,并验证它们没有更改。如果不是这种情况,请查看是否可以编写 CREATE TABLE 语句并发布它们,以便我们可以尝试重现此问题。如果您的问题是准确的,我看不出它怎么可能发生。 您可以尝试的一件事是,首先,在“TEAM”之后的左括号之前放置一个空格,并在其前面加上“dbo”。只是看看这是否有所作为。不应该,但我是格式良好的 SQL 的忠实拥护者。 我已经刷新并尝试使用空间并添加“DBO”。对球员和球队。没有骰子。 你能提供一个脚本来重现这个问题吗? 【参考方案1】:

错误信息实际上非常清楚地描述了问题所在。

您正在尝试添加一个外键,上面写着“对于 Player 表中的每个 Team Name 和 Location,Team 表中必须有一个匹配的 Team Name 和 Location”。

错误消息明确告诉您它无法添加约束,因为情况并非如此:Player 表中的 Team Name 和 Location 不存在于 Team 表中。

这样的查询应该列出存在问题的行...并且您需要先将具有这些团队名称和位置的行添加到您的团队表中(或从球员表中删除这些行),然后才能成功添加约束:

SELECT *
  FROM dbo.Player p
 WHERE NOT EXISTS (SELECT * 
                     FROM dbo.Team t 
                    WHERE t.Team_Name = p.Team_Name AND t.Team_Location = p.Team_Location)

此外,外键引用必须引用主键索引。由于本例中的主键是名字和姓氏,而不是团队名称和位置,因此不能应用 FK 约束。它需要这样做,以便它可以进行有效的查找并具有唯一性保证以验证约束。

【讨论】:

我不认为错误消息是这么说的。 Team 表显然还需要一个主键,即“Team_Name”和“Team_Location”……所以它可以进行查找。 嗯,是的,但根据问题中的图片,它有一个。 更仔细地查看图像......它没有。主键在 Last_Name、FIrst_Name 上,而不是 Team_Name 和 Team_Location,这就是问题所在。用那个更新我的答案...... 这是玩家桌的PK,不是团队桌的PK。再看一遍。 :)【参考方案2】:

更改了列名的顺序,效果很好。不敢相信我以前没见过!

使用 MyTestDB ALTER TABLE dbo.Player 添加约束 FK_Player_Team 外键(Team_Location、Team_Name) 参考 dbo.TEAM (Team_Location,Team_Name)

【讨论】:

以上是关于添加外键约束时出错的主要内容,如果未能解决你的问题,请参考以下文章

创建外键时出错:MySQL 错误 1215:无法添加外键约束 [重复]

Laravel 5.4 - 删除外键的唯一约束时出错[重复]

我尝试创建关系时出错:外键约束格式不正确-MariaDB

怎么添加外键约束

更新迁移到数据库时出错:外键约束可能导致循环或多个级联路径

创建外键时,phpmyadmin 中的外键约束失败