2011-08-25 166 views
1

唯一列假设我已经在数据库中下表:SQL Server 2008中的条件

Id ProductId ColorId IsDeleted 
1 1   1  1 
2 1   1  0 
3 2   3  0 

我要让ProductIdColorId列独一无二的,但只对那些行,其中IsDeleted = 0。我如何才能达到这个要求?

我知道,我可以创建一个约束来调用存储函数。存储的函数将尝试查找具有相同值的条目。但我认为这是复杂的方式。可能有更好的决定...

+5

在SQL Server ** 2008 **(和更新版本)中,您可以使用**过滤的唯一索引**;请参阅http://technet.microsoft.com/en-us/library/cc280372.aspx –

回答

3

在SQL Server 2008和更新,你可以利用过滤指标来实现这一目标:

CREATE NONCLUSTERED UNIQUE INDEX ProductColor 
    ON dbo.YourTable(ProductID, ColorID) 
    WHERE IsDeleted = 0; 

一些更多的背景和最佳实践见Filtered Index Design Guidelines

+3

顺便说一句,WHERE IsDeleted = 0条件对我无效。它表示“过滤索引不能在表上创建,因为过滤器表达式中的列IsDeleted与较高数据类型优先级或不同排序规则的常量进行比较。不支持将列转换为常量的数据类型过滤的索引要解决此错误,请显式将常量转换为与“Is_Deleted”列相同的数据类型和归类。“所以,我设法将代码更改为“WHERE Is_Deleted = CONVERT(bit,0)” – Egor4eg