【问题标题】:SQL Server unique constraint (but only sometimes)SQL Server 唯一约束(但仅有时)
【发布时间】:2010-09-30 22:11:16
【问题描述】:
假设我有一个包含 3 列的表格:
ID(唯一 ID)
说明(varchar 2000)
IsDeleted(布尔值)
我想添加一个唯一约束,以便所有描述都是唯一的。但仅适用于活动记录,即 IsDelete = false。如果用户将记录标记为已删除,他们可以重新添加与已删除记录具有相同描述但与活动记录不同的记录。
所以,我只希望约束影响 IsDeleted = false 的记录。
提姆
【问题讨论】:
标签:
sql-server
database-design
【解决方案1】:
在 SQL 2008 中,您可以使用带有过滤器的唯一索引来执行此操作:
CREATE UNIQUE NONCLUSTERED INDEX ix_table_UNC ON table(Description) WHERE IsDeleted = 0
在 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);
【解决方案2】:
为已删除的行创建一个新表。然后使用 UNIQUE 约束强制唯一性。由于 SQL Server 中的最大键大小为 900 字节,因此您必须将 Description 变小。