关于(所有)NON-NULL行值的SQL Server唯一索引

时间:2015-07-24 11:39:34

标签: sql-server tsql

我有一个表格,我推送相关数据。它有6列可以为空。基于某些逻辑,2的组合始终是非空的(最后4个中的第1个和第2个中的一个以及后4个中的一个)。这样我避免使用8个不同的表来保存数据。

是否有任何T-SQL (开始相当新的SQL Server细节)快捷方式,在这6列上创建一个唯一键,表示确保索引中提到的列之间的任何非空组合(1st-6th)是唯一的,没有真正特定的开始?

我可以为每个组合创建唯一索引,但我想知道是否有任何保持懒惰的快捷方式并使用(写) 1索引与其中的8个。它显然不是一个很大的努力,但更短的东西更好......在代码中,大多数时候都是这样!

4 个答案:

答案 0 :(得分:2)

  1. 制定检查约束以确保前两个中只有一个被设置,而后一个中只有一个。
  2. 制作计算列(computed1, computed2)和列start
  3. 制作唯一索引begin
  4. 我希望我做对了。也许你需要稍微改变一下。

答案 1 :(得分:1)

在以下内容上创建计算列:

COALESCE(
   cast(1 as binary(1)) + cast(col1 as binary(4)) /* Choose appropriate length for the type of col1 */
  ,cast(2 as binary(1)) + cast(col2 as binary(4)) /* Choose appropriate length for the type of col2 */
)
+ COALESCE(
   cast(3 as binary(1)) + cast(col3 as binary(4)) /* Choose appropriate length for the type of col3 */
  ,cast(4 as binary(1)) + cast(col4 as binary(4)) /* Choose appropriate length for the type of col4 */
  ,cast(5 as binary(1)) + cast(col5 as binary(4)) /* Choose appropriate length for the type of col5 */
  ,cast(6 as binary(1)) + cast(col6 as binary(4)) /* Choose appropriate length for the type of col6 */
  )

您可能不需要每对中的第一个值 - 取决于(17,null,1,null,null,null)是否应与(null,17,null,null,1,null)相同或不相同。

但无论如何,使用此计算列,您可以在其上放置唯一索引。 :)

您可以在两列中执行此操作,但您可以在单个列中执行此操作。

答案 2 :(得分:0)

我认为没有,SQL-Server中的索引是唯一的(在索引中的所有行上),或者它不是唯一的。

答案 3 :(得分:0)

只需在6列

上创建一个唯一索引