Есть ли способ проверить со стороны СУБД, если в таблице уже установлен «логический» столбец (true), но только для подмножества строк - PullRequest
0 голосов
/ 30 мая 2019

Я использую MSSQL Server и хочу узнать, есть ли способ со стороны СУБД проверить, проверен ли уже «логический» столбец (true) в таблице, но только для подмножества строк.

Вот пример:

У меня есть следующие таблицы

Пользователи

id | name
--------------------
10 | John Smith
11 | Lee Sin

Типы

id | name
--------------------
20 | Developer
21 | Tester
22 | User

UsersTypes

UserId  | TypeId | IsDefaultChoice
--------------------
10      | 20     | true
10      | 21     | false
11      | 20     | true

Я хочу вставить в таблицу «UsersTypes» следующее:

UserId  | TypeId | IsDefaultChoice
--------------------
10      | 22     | true

* Примечание:В столбце «IsDefaultChoice» по всей таблице будет несколько строк со значением «true», но я хочу, чтобы только одна строка могла быть установлена ​​в «true» для группы UserId в таблице «UsersTypes».

Я ищу способ принудительной вставки, потому что у пользователя «Джон Смит» уже есть одна запись «IsDefaultChoice» в true, и у него не может быть двух «истинных» записей для этого пользователя при вставке (илиобновление)

1 Ответ

1 голос
/ 30 мая 2019

Да, вы можете добавить отфильтрованный уникальный индекс:

create unique index unq_usertypes_default
    on usertypes(userId)
    where IsDefaultChoice = 'TRUE';

Это гарантирует, что для IsDefaultChoice будет установлено не более одной строки в UserTypes.Обратите внимание, что это потенциально усложняет обновление строк до нового значения по умолчанию - вы должны быть уверены, что удалили предыдущую.

Обратите внимание, что SQL Server не имеет типа boolean.Я предполагаю, что вы имеете в виду bit, который распознает 'TRUE' и 'FALSE' в качестве допустимых значений.

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