Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 修改要过滤的约束_Sql_Sql Server_Where Clause_Unique Constraint_Unique Index - Fatal编程技术网

Sql 修改要过滤的约束

Sql 修改要过滤的约束,sql,sql-server,where-clause,unique-constraint,unique-index,Sql,Sql Server,Where Clause,Unique Constraint,Unique Index,我正在考虑将数据库中预先存在的约束转换为过滤约束。这是目前存在的限制: ALTER TABLE [dbo].[ALIAS] ADD CONSTRAINT [AK_ALIAS001] UNIQUE NONCLUSTERED ( [ASSIGNEDBY] ASC, [ROLETYPE] ASC, [CODEALIAS] ASC, [ALIASASSIGNEDBY] ASC ) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPU

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

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
创建唯一索引[IDX\u ALIAS001]
在[dbo]。[ALIAS]([ASSIGNEDBY],[ROLETYPE],[CODEALIAS],[ALIASASSIGNEDBY])
其中[ALIASASSIGNEDBY]1

在我阅读您的需求的方式中,您希望在集合中的
ALIASASSIGNEDBY=1
的元组上强制执行唯一性(并且,通过扩展,如果
ALIASASSIGNEDBY 1
,则一切正常)

如果我有上述正确答案,我会这样做:

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

  • 由于此索引现在仅适用于数据的子集,因此使用以前的索引(根据唯一约束隐式创建)的查询可能不再能够使用新索引。有东西要检查
  • 您可能不需要将
    [ALIASASSIGNEDBY]
    作为索引中的键列。按照我定义它的方式,所有符合过滤器条件的行都将具有相同的值,因此从强制唯一性的角度来看,它是多余的
  • 如果您使用允许其的SQL版本,请考虑将其作为在线索引创建,以避免在持续时间内锁定表。
  • 如果您在允许它的SQL版本上,请考虑将数据压缩添加到索引中。根据我的经验,这几乎总是个好主意™.
    谢谢你提供的细节!我将研究第3点和第4点,对于第1点,我如何进行测试?这是一个仅尝试它是良性的案例。如果功能已启用,将允许您继续。如果您没有,它将给您一个错误,并且没有进行任何更改。