Для этого вы можете использовать проверочное ограничение.
create table some_table
(
flag1 boolean not null,
flag2 boolean not null,
flag3 boolean not null,
constraint only_one_true
check ( (flag1,flag2,flag3) IN ( (true, false, false),
(false, true, false),
(false, false, true)) )
);
Выше приведен стандартный SQL.
Некоторые системы СУБД также позволяют приводить логическое значение к числу, представляющему 0
или 1
, в этом случае вы можете просто добавить их исумма должна быть равна 1 (при условии, что для одного флага установлено значение true)
create table some_table
(
flag1 boolean not null,
flag2 boolean not null,
flag3 boolean not null,
constraint only_one_true
check ( cast(flag1 as integer) +
cast(flag2 as integer) +
cast(flag3 as integer) = 1 )
);