8

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

4

4 回答 4

9

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

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 )
于 2011-05-12T18:55:57.073 回答
1

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

于 2011-05-12T18:56:18.853 回答
0

在 SQL Server 2008 中,您可以在不为空的值上创建过滤索引- 不幸的是,这是 2008 版本中的一项新功能,所以在 2005 年,您无法执行此类操作,恐怕.

于 2011-05-12T18:55:37.217 回答
0

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

请参阅在 SQL Server 中创建忽略空值的唯一约束。它涵盖了三种不同的方法。

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

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

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

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

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

    啊,TSQL 的强大功能(阅读:要处理的其他事情)。我没有走这条路。

快乐编码。

于 2011-05-12T19:01:43.657 回答