尝试创建筛选索引报错,能否实现两列相等时v列唯一约束?
实现当a=b时v列的唯一约束需求
问题原因
SQL Server的筛选索引WHERE子句不支持直接使用列间的比较表达式(如a = b),这是触发报错的核心原因,官方文档未明确提及该具体限制。
解决方案
通过添加计算列绕开限制,具体步骤如下:
添加标记a、b是否相等的计算列
创建一个计算列存储a = b的判断结果,可选设置为持久化以提升索引性能:ALTER TABLE test123 ADD is_a_eq_b AS CASE WHEN a = b THEN 1 ELSE 0 END PERSISTED;基于计算列创建唯一筛选索引
利用计算列的判断结果作为筛选条件,确保仅当a = b时v列具备唯一约束:CREATE UNIQUE INDEX ix_test123 ON test123(v) WHERE is_a_eq_b = 1;
效果验证
- 当
a = b时,插入重复的v值会触发唯一约束报错,符合需求; - 当
a ≠ b时,重复的v值可正常插入,不受约束限制。
内容的提问来源于stack exchange,提问作者Alex B
相关产品推荐
相关产品推荐

