多个可为空列的唯一约束Sql Server

And*_*sen 1 sql-server-2008 sql-server constraint unique-constraint

我们有一个包含以下列的 PriceCombo 表:id(非空)、a_id(空)、b_id(空)、c_id(空)、折扣(非空)。我们正在使用此表来确定分配各种商品组合的价格。

a_id = id of region
b_id = id of merchandize category
c_id = id of customer category
Run Code Online (Sandbox Code Playgroud)

所以基本上,我们总是知道 a、b 和 c,但我们有一个灵活的折扣方案,这样每笔销售都按照我们能找到的最具体的规则进行折扣。

我们的问题是我们无法防止数据库中的重复,例如,我们希望防止在 a_id、b_id 和 c_id 中具有相同值的两行

a_id=1, b_id=1, c_id=1    and
a_id=1, b_id=1, c_id=1 
Run Code Online (Sandbox Code Playgroud)

不被允许和

a_id=1, b_id=1, c_id=null   and
a_id=1, b_id=1, c_id=null
Run Code Online (Sandbox Code Playgroud)

不被允许,但

a_id=1, b_id=1, c_id=null  and
a_id=1, b_id=null, c_id=null
Run Code Online (Sandbox Code Playgroud)

是允许的,因为这些在这 3 列方面不相同。

我在任何地方都没有找到关于如何创建唯一约束的答案,该约束既跨越多列又允许空值但不允许“相同”(至少在约束中指定的列方面)行

Jon*_*gel 6

没有什么特别可以阻止您在这里使用标准的唯一约束,除非您没有告诉我们一些事情。

在一组可为空的列上创建唯一约束时,NULL将像对待该组中的任何其他不同值一样(就唯一性而言)进行处理。(我相信这种行为因 RDBMS 而异。)

因此,我认为您可能必须在这里防范的唯一情况是所有三列同时包含NULL的情况。如果这对您的业务逻辑无效,还要创建一个CHECK约束来禁止这种组合。

  • 如果你想在所有三列都是“NULL”的情况下允许重复,你也可以做一个过滤的唯一索引而不是约束。 (2认同)