如何在oracle表上强制使用唯一的2元组?

时间:2015-01-29 02:41:03

标签: database oracle constraints unique

我正在尝试强制表匹配应具有所有唯一元组(Team 1,Team 2)的属性。但是,让1队=底特律活塞队和2队=芝加哥公牛队。如果(芝加哥公牛队,底特律活塞队)已经存在,我不想允许(底特律活塞队,芝加哥公牛队)插入桌面。

如何强制执行此约束?

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或更多元组。