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

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

0 голосов
/ 15 декабря 2018

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

Ответы [ 2 ]

0 голосов
/ 15 декабря 2018

Для этого вы можете использовать проверочное ограничение.

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 )
);
0 голосов
/ 15 декабря 2018

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

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

(просто чтобы понять, синтаксис может варьироваться от СУБД к СУБД.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...