check约束

qacovj5a  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(452)

我有一个表,它有一个名为“flag”的位列,它不允许null。这里的一个要求是 Flag=1 为下表中的每个id设置,但每个唯一id和标志列组合仅设置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
xurqigkl

xurqigkl1#

你不是在找一个 check 约束。需要筛选的唯一约束:

create unique index unq_test_id_flag
    on #test(id)
    where flag = 1;

这是一把小提琴。

相关问题