如何解决修改要过滤的约束
我正在考虑将数据库中的预先存在的约束转换为过滤后的约束。这是目前存在的约束:
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;
一些注意事项:
- 由于该索引现在仅适用于数据的子集,因此使用先前索引(隐式根据唯一约束创建)的查询可能不再能够使用新索引。有东西要检查!
- 您可能不需要
[ALIASASSIGNEDBY]
作为索引中的键列。按照我定义的方式,所有符合过滤条件的行都将具有相同的值,因此从强制执行唯一性的角度来看这是多余的。 - 如果您正在使用允许它的SQL版本,请考虑将其创建为在线索引,以避免在持续时间内锁定表。
- 如果您正在使用允许它的SQL版本,请考虑将数据压缩添加到索引中。根据我的经验,它几乎总是好主意™。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。