我正在尝试添加外键约束,但无法弄清楚我做错了什么。提前感谢任何建议。
使用MyTestDB
ALTER TABLE播放器
添加约束FK_Player_Team
FOREIGN KEY(Team_Name,Team_Location)
REFERENCES TEAM(Team_Name,Team_Location)
Msg 1776,Level 16,State 0,Line 8 参考表中没有主键或候选键' TEAM'与外键中的引用列列表匹配' FK_Player_Team'。 Msg 1750,Level 16,State 0,Line 8 无法创建约束。查看以前的错误。
答案 0 :(得分:1)
在准确描述问题所在的过程中,错误信息实际上非常清楚。
您正在尝试添加一个外键,上面写着“对于Player表中的每个团队名称和位置,Team表中必须有匹配的团队名称和位置”。
错误消息明确告诉您它无法添加约束,因为情况并非如此:在Player表中有一个Team Name和Location,Team表中不存在。
这样的查询应该列出出问题的行......你需要先将这些团队名称和位置的行添加到Team表中(或者从Player表中删除这些行),然后才能成功添加约束:
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约束。它需要这样做,以便它可以进行有效的查找,并具有唯一性保证,以验证约束。
答案 1 :(得分:1)
更改了列名的顺序,工作正常。我不相信我之前没有看到过!
使用MyTestDB
ALTER TABLE dbo.Player
添加约束FK_Player_Team
FOREIGN KEY(Team_Location,Team_Name)
参考文献dbo.TEAM(Team_Location,Team_Name)