假设我有一个名为 Matchup 的表,其中包含两个运动队。我还有一个名为 Pick 的表,其中有一列必须匹配 Team_A或Team_B。所以它是 Matchup 中一个或其他列的外键。这可能吗?
对战队_A
队
_B
Pick
Pick_Team - FK 比赛(必须与比赛中的 Team_A 或 Team_B 匹配)。
假设我有一个名为 Matchup 的表,其中包含两个运动队。我还有一个名为 Pick 的表,其中有一列必须匹配 Team_A或Team_B。所以它是 Matchup 中一个或其他列的外键。这可能吗?
对战队_A
队
_B
Pick
Pick_Team - FK 比赛(必须与比赛中的 Team_A 或 Team_B 匹配)。
我不认为这是正确的方法。
我宁愿建议您在表 Matchup 中添加一个附加字段(比如说 Pick),并添加一个CHECK CONSTRAINT以确保它是 Team_A 或 Team_B。
CHECK 约束通过限制一个或多个列接受的值来强制域完整性。您可以使用基于逻辑运算符返回 TRUE 或 FALSE 的任何逻辑(布尔)表达式创建 CHECK 约束。
来自外键约束
在外键引用中,当保存一个表的主键值的一个或多个列被另一个表中的一个或多个列引用时,将在两个表之间创建一个链接。此列成为第二个表中的外键。
它似乎不是你要找的。
我会将您的Matchup表分成两部分:Matchup正确和MatchupDetails.
该Matchup表将有一MatchupID列作为其主键。
一个MatchupDetails至少包含两列:MatchupID引用Matchup表格和TeamID引用Team表格(你确实有一个,不是吗?)。这两列将形成表的复合主键。
最后,会有这张Pick桌子。由于您有多个用户(根据您的评论之一),因此需要一个UserID参考。另外两列,MatchupID&TeamID将用作引用 中设置的相应列的复合外键MatchupDetails。并且为了确保一个用户只能从比赛中选择一个团队,(UserID, MatchupID)应该使用复合主键。
总而言之,这里是模式相关部分的完整大纲:
Matchup:
MatchupID
PRIMARY KEY (MatchupID)
MatchupDetails:
MatchupID
TeamID
FOREIGN KEY (MatchupID)
FOREIGN KEY (TeamID)
PRIMARY KEY (MatchupID, TeamID)
Pick:
UserID
MatchupID
TeamID
FOREIGN KEY (UserID)
FOREIGN KEY (MatchupID, TeamID)
PRIMARY KEY (UserID, MatchupID)