想象一下,我有一个包含3列的表:
ID(唯一ID) 描述(varchar 2000) IsDeleted(布尔值)
我想添加一个唯一约束,以便所有描述都是唯一的。但仅限于活动记录,即IsDelete = false。如果用户将记录标记为已删除,则可以重新添加与已删除记录具有相同描述的记录,但不能与活动记录相同。
所以,我只想要约束来影响IsDeleted = false的记录。
添
答案 0 :(得分:6)
在SQL 2008中,您可以使用带过滤器的唯一索引来执行此操作:
CREATE UNIQUE NONCLUSTERED INDEX ix_table_UNC ON table(Description) WHERE IsDeleted = 0
Pre-SQL 2008,您需要在表的视图上创建唯一索引,仅选择未删除的记录:
CREATE VIEW dbo.vw_ActiveDescriptions WITH SCHEMABINDING
AS
SELECT Id, Description
FROM Table
WHERE IsDeleted= 0
GO
CREATE UNIQUE CLUSTERED INDEX ix_vw_ActiveDescriptions_UC ON dbo.vw_ActiveDescriptions(Description);
答案 1 :(得分:2)
为已删除的行创建一个新表。然后使用UNIQUE约束强制唯一性。您必须使描述更小,因为SQL Server中的最大密钥大小为900字节。