【问题标题】:The proper way to implement unique constraint that allows multiple NULL values in SQL Server在 SQL Server 中实现允许多个 NULL 值的唯一约束的正确方法
【发布时间】:2011-08-30 14:37:29
【问题描述】:


我需要表中的 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 ));

它有效,但要求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]);

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

这种情况的最佳做法是什么?
感谢您的回答。

【问题讨论】:

    标签: sql-server tsql sql-server-2008


    【解决方案1】:

    4 种方式:

    • Filtered index (SQL Server 2008)
    • 触发器(提及)
    • 索引视图(在您的问题中)
    • 具有计算列的唯一约束/索引(在您的问题中)

    【讨论】:

    • 非常感谢,我不知道过滤索引 - 这正是我需要的。
    【解决方案2】:

    SQL 2008 允许您定义过滤索引 - 本质上是一个带有 WHERE 子句的索引 - 请参阅 Phil Haselden 对 this question 的回答以获取 MSDN 链接和示例。

    【讨论】:

      【解决方案3】:

      标准化它。将该列与当前表的主键一起移动到新表中。使列在新表中唯一且不为空。可空唯一约束没有逻辑意义,几乎没有实际用途。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多