我正在尝试强制表匹配应具有所有唯一元组(Team 1,Team 2)的属性。但是,让1队=底特律活塞队和2队=芝加哥公牛队。如果(芝加哥公牛队,底特律活塞队)已经存在,我不想允许(底特律活塞队,芝加哥公牛队)插入桌面。
如何强制执行此约束?
答案 0 :(得分:4)
A)元组在语义上是相同的。 (我认为这是你的情况。)
这意味着元组{芝加哥公牛队,底特律活塞}意味着与元组{底特律活塞队,芝加哥公牛队}完全相同。使用CHECK约束在两列上强制执行订单。
CHECK (column_1 < column_2)
这种限制将允许{芝加哥公牛队,底特律活塞},但它会拒绝{底特律活塞队,芝加哥公牛队}。这有点像在其他自由格式数据上强加规范形式。
B)元组在语义上是不同的。
这意味着元组{芝加哥公牛队,底特律活塞}意味着一件事,而元组{底特律活塞队,芝加哥公牛队}意味着别的东西。例如,第一个属性可能意味着&#34;主队&#34;,第二个属性可能意味着&#34;访问团队&#34;。在这种情况下,您只需要对这对列进行某种独特的约束。
答案 1 :(得分:3)
您可以创建基于函数的唯一索引:
CREATE UNIQUE INDEX unq_match ON match ( LEAST(team1,team2), GREATEST(team1,team2) );
LEAST()
将获得两个团队中的“较小”(无论是通过ID还是名称,无关紧要),而GREATEST
将获得两者中的“更大”。不幸的是,这个特殊的解决方案不能扩展到3或更多元组。