唯一列假设我已经在数据库中下表:SQL Server 2008中的条件
Id ProductId ColorId IsDeleted
1 1 1 1
2 1 1 0
3 2 3 0
我要让ProductId
和ColorId
列独一无二的,但只对那些行,其中IsDeleted = 0
。我如何才能达到这个要求?
我知道,我可以创建一个约束来调用存储函数。存储的函数将尝试查找具有相同值的条目。但我认为这是复杂的方式。可能有更好的决定...
唯一列假设我已经在数据库中下表:SQL Server 2008中的条件
Id ProductId ColorId IsDeleted
1 1 1 1
2 1 1 0
3 2 3 0
我要让ProductId
和ColorId
列独一无二的,但只对那些行,其中IsDeleted = 0
。我如何才能达到这个要求?
我知道,我可以创建一个约束来调用存储函数。存储的函数将尝试查找具有相同值的条目。但我认为这是复杂的方式。可能有更好的决定...
在SQL Server 2008和更新,你可以利用过滤指标来实现这一目标:
CREATE NONCLUSTERED UNIQUE INDEX ProductColor
ON dbo.YourTable(ProductID, ColorID)
WHERE IsDeleted = 0;
一些更多的背景和最佳实践见Filtered Index Design Guidelines。
顺便说一句,WHERE IsDeleted = 0条件对我无效。它表示“过滤索引不能在表上创建,因为过滤器表达式中的列IsDeleted与较高数据类型优先级或不同排序规则的常量进行比较。不支持将列转换为常量的数据类型过滤的索引要解决此错误,请显式将常量转换为与“Is_Deleted”列相同的数据类型和归类。“所以,我设法将代码更改为“WHERE Is_Deleted = CONVERT(bit,0)” – Egor4eg
在SQL Server ** 2008 **(和更新版本)中,您可以使用**过滤的唯一索引**;请参阅http://technet.microsoft.com/en-us/library/cc280372.aspx –