如何在 oracle table 上强制执行唯一的 2 元组?

How to enforce unique 2-tuple on oracle table?

我正在尝试强制执行 属性 table 匹配应该具有所有唯一元组(第 1 队,第 2 队)。但是,让第 1 队 = 底特律活塞队和第 2 队 = 芝加哥公牛队。如果 (Chicago Bulls, Detroit Pistons) 已经存在,我不想让 (Detroit Pistons, Chicago Bulls) 插入 table。

如何强制执行此约束?

您可以创建一个独特的基于函数的索引:

CREATE UNIQUE INDEX unq_match ON match ( LEAST(team1,team2), GREATEST(team1,team2) );

LEAST()会得到两支球队的"lesser"(无论是ID还是名字都无所谓)而GREATEST会得到"greater"的他们俩。不幸的是,这个特定的解决方案不能扩展到 3 个或更多个元组。

A​​) 元组在语义上是相同的。 (我认为这就是你的情况。)

这意味着元组 {Chicago Bulls, Detroit Pistons} 与元组 {Detroit Pistons, Chicago Bulls} 的含义完全相同。使用 CHECK 约束对两列进行排序。

CHECK (column_1 < column_2)

这种约束会允许{芝加哥公牛队、底特律活塞队},但会拒绝{底特律活塞队、芝加哥公牛队}。这有点像将规范形式强加于其他自由形式的数据。

B) 元组在语义上是不同的。

这意味着元组 {Chicago Bulls, Detroit Pistons} 表示一回事,而元组 {Detroit Pistons, Chicago Bulls} 表示另一回事。例如,第一个属性可能表示 "home team",第二个可能表示 "visiting team"。在这种情况下,您所需要的只是对这对列的某种唯一约束。