具有空值的SQL Server 2005唯一键

时间:2011-05-12 18:52:52

标签: sql-server-2005 unique-key

我在SQL Server 2005中有一个带有外键的表,我希望该外键是唯一值或null。我已将其设置为唯一键,但它不允许我在同一个表中有多个空值。可以做我想做的事吗?

4 个答案:

答案 0 :(得分:9)

这是关于SQL Server唯一约束/索引的长期抱怨。最好的解决方案是使用schemabinding创建一个视图,然后在该列上放置一个唯一索引:

Create View dbo.MyUniqueColView
With SchemaBinding
As
Select MyColToBeUnique
From MyTable
Where MyColToBeUnique Is Not Null

GO

Create Unique Clustered Index IX_MyTable_MyColToBeUnique On MyUniqueColView ( MyColToBeUnique )

答案 1 :(得分:1)

您无法在SQL Server 2005中使用表级约束强制执行此操作,但您可以创建定义为SELECT Col FROM t WHERE Col IS NOT NULL的视图,然后在其上创建唯一的聚簇索引。

答案 2 :(得分:0)

在SQL Server 2008中,您可以在非空值上创建 filtered index - 遗憾的是,这是2008版本中的新功能,因此在2005年,您将'我不敢做那样的事情,我很害怕。

答案 3 :(得分:0)

总是我的烦恼。我更喜欢标准的“其他”解释。

Creating a unique constraint that ignores nulls in SQL Server。它涵盖了三种不同的方法。

  1. 解决方案1:过滤索引。

    从其他回复来看,这看起来很常见。我没有尝试过这种方法 - 它确实需要 SQL Server 2008。

  2. 解决方案2:计算列的约束

    我已经使用了它,它确实有效。但是,可能需要调整关系和/或添加索引的二级非唯一覆盖(一个用于唯一约束,一个用于索引覆盖)。

  3. 解决方案3:UDF检查约束(不推荐)

    啊,TSQL的强大功能(阅读: else 来处理)。我没有走这条路。

  4. 快乐的编码。