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