SQL Server - 外键引用主键A OR B.

时间:2013-08-13 04:55:44

标签: sql-server foreign-key-relationship

假设我有一个名为Matchup的桌子,其中包含两个运动队。我还有一个名为Pick的表,其中的列必须与Team_A OR Team_B匹配。所以它是Matchup中一个或另一个列的外键。这可能吗?

对决
Team_A
Team_B

选取
Pick_Team - FK比赛(必须与比赛中的Team_A或Team_B匹配)。

2 个答案:

答案 0 :(得分:0)

我不认为这是正确的方法。

我更愿意建议你在表格Matchup中添加一个额外的字段(比方说Pick)并添加CHECK CONSTRAINT以确保它是Team_A或Team_B。

  

CHECK约束通过限制值来强制域完整性   被一列或多列接受。您可以创建CHECK约束   使用任何返回TRUE或FALSE的逻辑(布尔)表达式   关于逻辑运算符。

来自FOREIGN KEY Constraints

  

在外键引用中,在两个表之间创建链接   包含一个表的主键值的一列或多列   由另一个表中的一列或多列引用。这一栏   成为第二个表中的外键。

它似乎不是你想要的。

答案 1 :(得分:0)

我会将您的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)