У меня есть три логических атрибута в моем отношении, и я хочу, чтобы только один из них имел истинное значение, иначе таблица должна выдать ошибку. Как я могу это сделать?
@ paulsm4: конечно, это можно сделать с помощью SQL, это называется проверочным ограничением
@GordonLinoff: да, это так. Логический тип был введен в SQL: 1999, см., Например, эта презентация - Как ни странно, это от Oracle, хотя в Oracle все еще отсутствует настоящий логический тип.


Вы можете использовать ограничение проверки, если ваша СУБД поддерживает их (большинство из них поддерживает). В нем вы проверяете, что верно ровно один из флагов. Для этого вы можете использовать логическое выражение.
CREATE TABLE elbat
(...
CHECK (flag1 = true
AND flag2 = false
AND flag3 = false
OR flag1 = false
AND flag2 = true
AND flag3 = false
OR flag1 = false
AND flag2 = false
AND flag3 = true));
(Чтобы понять, синтаксис может отличаться от СУБД к СУБД.)
Для этого вы можете использовать проверочное ограничение.
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 )
);
Какая у вас СУБД?