修改要过滤的约束

Modify Constraint to be Filtered

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

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,我需要能够为这些字段提供非唯一值。

根据我的阅读,我认为我应该能够使这个约束成为条件,但我不确定如何。

您可以使用唯一过滤索引执行此操作:

CREATE UNIQUE INDEX [IDX_ALIAS001] 
    ON [dbo].[ALIAS] ([ASSIGNEDBY], [ROLETYPE], [CODEALIAS], [ALIASASSIGNEDBY])
    WHERE [ALIASASSIGNEDBY] <> 1

按照我阅读您的要求的方式,您希望在 ALIASASSIGNEDBY = 1 所在的集合中对该元组强制执行唯一性(并且,通过扩展,如果 ALIASASSIGNEDBY <> 1,任何事情都会发生)。

如果以上正确,我会这样做:

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

一些注意事项:

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