Проверьте ограничение, чтобы 2 или более строк не имели значения 1 c 1 - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть таблица SQL со столбцом с именем [apply], только одна строка из всех строк может быть применена (имеет значение 1), все остальные строки должны иметь значение 0

Есть ли проверочное ограничение, которое я могу написать, чтобы вызвать такой случай?

Ответы [ 4 ]

0 голосов
/ 27 февраля 2020

Большинство баз данных поддерживают отфильтрованные индексы:

create unique index unq_t_applied on t(applied) where applied = 1;
0 голосов
/ 27 февраля 2020

Хотя это можно сделать с помощью триггеров и ограничений, для них, вероятно, требуется индекс. Вместо этого рассмотрим таблицу объединения.

create table things_applied (
  id smallint primary key default 1,
  thing_id bigint references things(id) not null,
  check(id = 1)
);

Поскольку первичный ключ уникален, может быть только одна строка .

Первая активируется с помощью вставки. .

insert into things_applied (thing_id) values (1);

Измените его, обновив строку.

update things_applied set thing_id = 2;

Чтобы полностью деактивировать, удалите строку.

delete things_applied;

Чтобы найти активную строку, присоединитесь с таблицей.

select t.*
from things t
join things_applied ta on ta.thing_id = t.id

Чтобы проверить, активна ли она вообще, подсчитайте строки.

select count(id) as active
from things_applied

Попробуйте.

0 голосов
/ 27 февраля 2020

Если вы используете ноль вместо 0, это будет намного проще.

Имеет ограничение CHECK, чтобы убедиться, что (ненулевое) значение = 1. Также есть ограничение UNIQUE, разрешающее только один значение 1.

create table testtable (
    id int primary key,
    applied int,
    constraint applied_unique unique (applied),
    constraint applied_eq_1 check (applied = 1)
);

Core ANSI SQL, т. е. ожидается работа с любой базой данных.

0 голосов
/ 27 февраля 2020

Чтобы точно знать, как написать триггер, который поможет вам получить информацию о базе данных, которую вы используете.

Вам понадобится триггер, где это будет ваш тестовый элемент управления:

 SELECT COUNT(APPLIED) 
 FROM TEST
 WHERE APPLIED = 1

Если это> 0, то не разрешать вставку, иначе разрешить.

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