SQL: ограничение, обеспечивающее как минимум один && максимум один для каждого ключа - PullRequest
0 голосов
/ 20 марта 2012

Моя схема таблицы:

 r(int aID not null, int bID not null, bool main)

Первичный ключ (aId, bID). И aID, и bID являются внешними ключами (ссылаются на разные таблицы).

Я хочу обеспечить, чтобы для каждого идентификатора aID всегда была одна и только одна заявка bid, которая также main = true.

Как я могу сделать это на уровне БД? Я могу принудительно установить «max 1», добавив constraint unique (aID, main), и main имеет значение true или NULL.

Как насчет "хотя бы 1" части?

PS: работает на MySQL.

Редактировать: пример данных для уточнения: Вы можете иметь различные комбинации aID и bID, но для каждого aID только одна комбинация должна иметь main = true. Демо-данные:

 1, 2, true
 1, 3, NULL
 1, 4, NULL
 1, 5, true <- wrong, only one main=true
 ...

1 Ответ

0 голосов
/ 20 марта 2012

Вы должны создать два триггера. Оба они будут применимы для каждого ряда. Первый будет применяться до вставки, а второй будет применяться до обновления. Если main = true и в таблице есть хотя бы еще одна строка с тем же aID, что и new.aID, но с другим bID, также с main = true, установите new.main = false.

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

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