Системы баз данных SQL

У меня есть три логических атрибута в моем отношении, и я хочу, чтобы только один из них имел истинное значение, иначе таблица должна выдать ошибку. Как я могу это сделать?

Какая у вас СУБД?

iminiki 15.12.2018 07:20

@ paulsm4: конечно, это можно сделать с помощью SQL, это называется проверочным ограничением

a_horse_with_no_name 15.12.2018 11:00

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

a_horse_with_no_name 15.12.2018 14:14
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
3
31
2

Ответы 2

Вы можете использовать ограничение проверки, если ваша СУБД поддерживает их (большинство из них поддерживает). В нем вы проверяете, что верно ровно один из флагов. Для этого вы можете использовать логическое выражение.

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 )
);

Другие вопросы по теме