实现唯一约束的正确方法,允许SQL Server中的多个NULL值

a1e*_*x07 10 t-sql sql-server sql-server-2008


我需要表中的1列来保存唯一的非空值或NULL.TSQL UNIQUE约束将2 NULLs视为相等,因此我无法使列唯一.
处理这个问题的正确方法是什么?
在做了一些研究后,我发现了两种看似正确的方法,但我无法确定哪种方法更好.
第一个不适用于所有情况:

CREATE TABLE test (id INT NOT NULL IDENTITY(1,1) PRIMARY KEY, 
   null_or_unique_id INT, unique_key AS  
(CASE WHEN [null_or_unique_id] IS NULL THEN -(1)*[id] 
 ELSE [null_or_unique_id] END), UNIQUE(unique_key ));
Run Code Online (Sandbox Code Playgroud)

它的工作原理但要求所有允许的值null_or_unique_id都是非负的(在我的情况下也没问题)
第二个:

 CREATE VIEW test_view WITH SCHEMABINDING AS
 SELECT [null_or_unique_id] FROM dbo.test WHERE [null_or_unique_id] IS NOT NULL;
 GO
 CREATE UNIQUE CLUSTERED INDEX byNullOrUniqueId 
 ON dbo.test_view([null_or_unique_id]);
Run Code Online (Sandbox Code Playgroud)

当然,也可以使用触发器实现所需的功能,但我认为触发器解决方案将产生比上面提到的任何更多的开销.

这种情况的最佳做法是什么?
谢谢你的回答.

gbn*_*gbn 10

4种方式:

  • 过滤索引(SQL Server 2008)< - 根据您的标记推荐
  • 触发(提及)
  • 索引视图(在您的问题中)
  • 具有计算列的唯一约束/索引(在您的问题中)