使用过滤逻辑检查约束
Check Constraint with Filtering Logic
我有一个 table,它有一个名为 "Flag" 的位列,它不允许 NULL。这里的要求是始终为下面 table 中的每个 Id 设置 Flag=1
,但每个唯一的 Id 和 Flag 列组合仅设置 1 次。同时,如果有超过 1 个条目,则所有其他行都可以多次设置 Flag=0
。
基本上按 ID 分组的标志总和应始终为 1。
我虽然对 Id 和 Flag 字段有唯一约束,但由于 Flag=0
可以为同一组合设置多次,因此无法使用。
有什么建议吗?
--当前数据集
drop table if exists #test;
go
create table #Test (Id_pk int identity(1,1) not null, id int not null, Flag bit not null)
Insert into #Test (id, Flag)
values (12, 0), (12,0), (12, 0), (12,0), (12, 1), (12,1), (13,0), (13, 0), (14,1), (14,1), (20,1), (20,0), (30,1), (40,0)
select * from #Test
-- 期望的结果
drop table if exists #test;
go
create table #Test (Id_pk int identity(1,1) not null, id int not null, Flag bit not null)
Insert into #Test (id, Flag)
values (12, 0), (12,0), (12, 0), (12,0), (12, 0), (12,1), (13,0), (13, 1), (14,0), (14,1), (20,1), (20,0), (30,1), (40,1)
select * from #Test
您不是在寻找 check
约束条件。您需要过滤后的唯一约束:
create unique index unq_test_id_flag
on #test(id)
where flag = 1;
Here 是一个 db<>fiddle.
我有一个 table,它有一个名为 "Flag" 的位列,它不允许 NULL。这里的要求是始终为下面 table 中的每个 Id 设置 Flag=1
,但每个唯一的 Id 和 Flag 列组合仅设置 1 次。同时,如果有超过 1 个条目,则所有其他行都可以多次设置 Flag=0
。
基本上按 ID 分组的标志总和应始终为 1。
我虽然对 Id 和 Flag 字段有唯一约束,但由于 Flag=0
可以为同一组合设置多次,因此无法使用。
有什么建议吗?
--当前数据集
drop table if exists #test;
go
create table #Test (Id_pk int identity(1,1) not null, id int not null, Flag bit not null)
Insert into #Test (id, Flag)
values (12, 0), (12,0), (12, 0), (12,0), (12, 1), (12,1), (13,0), (13, 0), (14,1), (14,1), (20,1), (20,0), (30,1), (40,0)
select * from #Test
-- 期望的结果
drop table if exists #test;
go
create table #Test (Id_pk int identity(1,1) not null, id int not null, Flag bit not null)
Insert into #Test (id, Flag)
values (12, 0), (12,0), (12, 0), (12,0), (12, 0), (12,1), (13,0), (13, 1), (14,0), (14,1), (20,1), (20,0), (30,1), (40,1)
select * from #Test
您不是在寻找 check
约束条件。您需要过滤后的唯一约束:
create unique index unq_test_id_flag
on #test(id)
where flag = 1;
Here 是一个 db<>fiddle.