修改要过滤的约束

问题描述

我正在考虑将数据库中的预先存在的约束转换为过滤后的约束。这是目前存在的约束:

ALTER TABLE [dbo].[ALIAS] ADD  CONSTRAINT [AK_ALIAS001] UNIQUE NONCLUSTERED 
(
    [ASSIGNEDBY] ASC,[ROLETYPE] ASC,[CODEALIAS] ASC,[ALIASASSIGNEDBY] ASC
)

WITH (PAD_INDEX = OFF,STATISTICS_norECOmpuTE = OFF,SORT_IN_TEMPDB = OFF,IGnorE_DUP_KEY = OFF,ONLINE = OFF,ALLOW_ROW_LOCKS = ON,ALLOW_PAGE_LOCKS = ON,FILLFACTOR = 90)

ON [PRIMARY]
GO

我希望不会失去功能,但是现在我要添加一个新的ALIASASSIGNEDBY值,如果ALIASASSIGNEDBY的值不是1,则我必须能够使这些字段具有非唯一值。

从我的阅读中,我认为我应该能够使此约束成为条件,但我不确定如何做到。

解决方法

您可以使用唯一的过滤索引来做到这一点:

deactivated
,

我正在阅读您的要求的方式,您想在ALIASASSIGNEDBY = 1中的集合中对该元组强制执行唯一性(并且,如果是ALIASASSIGNEDBY <> 1,那么一切都会进行)。

如果我正确无误,请按以下步骤操作:

create unique index [UIX_ALIAS001] on [dbo].[ALIAS]
   ([ASSIGNEDBY],[ROLETYPE],[CODEALIAS],[ALIASASSIGNEDBY])
   WHERE [ALIASASSIGNEDBY] = 1;

一些注意事项:

  1. 由于该索引现在仅适用于数据的子集,因此使用先前索引(隐式根据唯一约束创建)的查询可能不再能够使用新索引。有东西要检查!
  2. 您可能不需要[ALIASASSIGNEDBY]作为索引中的键列。按照我定义的方式,所有符合过滤条件的行都将具有相同的值,因此从强制执行唯一性的角度来看这是多余的。
  3. 如果您正在使用允许它的SQL版本,请考虑将其创建为在线索引,以避免在持续时间内锁定表。
  4. 如果您正在使用允许它的SQL版本,请考虑将数据压缩添加到索引中。根据我的经验,它几乎总是好主意™。