SQL Server唯一约束(但有时仅限)

时间:2010-09-30 10:02:47

标签: sql-server database-design

想象一下,我有一个包含3列的表:

ID(唯一ID) 描述(varchar 2000) IsDeleted(布尔值)

我想添加一个唯一约束,以便所有描述都是唯一的。但仅限于活动记录,即IsDelete = false。如果用户将记录标记为已删除,则可以重新添加与已删除记录具有相同描述的记录,但不能与活动记录相同。

所以,我只想要约束来影响IsDeleted = false的记录。

2 个答案:

答案 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字节。