6

我有一张桌子,类似

FieldsOnForms(
 FieldID int (FK_Fields)
 FormID int (FK_Forms)
 isDeleted bit
)

对 (FieldID,FormID) 应该是唯一的,但仅当未删除行时 (isDeleted=0)。

是否可以在 SQLServer 2008 中定义这样的约束?(不使用触发器)

PS设置(FieldID,FormID,isDeleted)是唯一的增加了将一行标记为已删除的可能性,但我希望有机会将n行(每个FieldID,FormID)设置为isDeleted = 1,并且只有一个isDeleted = 0

4

3 回答 3

13

您可以使用 SQL Server 2008过滤索引功能拥有唯一索引,也可以对视图应用 UNIQUE 索引(穷人的过滤索引,适用于早期版本),但不能拥有 UNIQUE 约束,例如描述。

过滤索引的示例:

 CREATE UNIQUE NONCLUSTERED INDEX IX_FieldsOnForms_NonDeletedUnique ON FieldsOnForms (FieldID,FormID) WHERE isDeleted=0
于 2010-10-22T14:39:10.913 回答
4

您可以将 IsDeleted 列更改为 DeletedDate 并将其设置为 DATETIME,其中包含该行被逻辑删除的确切时间。或者,您可以添加一个 DeletedDate 列,然后针对该列创建一个 IsDeleted 计算列,以便在代码中使用该列时您仍然可以使用该列。然后,您当然会在 DeletedDate(除了 FieldID 和 FormId)而不是 IsDeleted 列上放置一个唯一索引。那将只允许一个 NULL 列。

Albin posted a solution similar to this, but then deleted it. I'm not sure why, but if he re-posts it then his was here before mine. :)

于 2010-10-22T14:44:57.803 回答
0

不,独特意味着真正独特。您要么必须将已删除的记录移动到另一个表,要么将 IsDeleted 更改为可以在所有已删除记录中唯一的内容(例如时间戳)。这两种解决方案都需要在您的应用程序、存储过程或触发器中进行额外的工作。

于 2010-10-22T14:41:04.793 回答