Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 создание constraint  [new]
Pupkin
Member

Откуда:
Сообщений: 120
Есть таблица Contracts и в ней поле IsGetter bit not null default 0.
Надо, чтобы значение IsGetter=1 (или true) было единственным в таблице.
Придумываю такой constraint:

alter table Contracts add constraint c_once_one
check((select count(*) from contracts where isGetter=1)<2);

Ругается: Subqueries are not allowed in this context. Only scalar expressions are allowed.

Подскажите как ...
3 окт 13, 02:37    [14915808]     Ответить | Цитировать Сообщить модератору
 Re: создание constraint  [new]
Crimzic
Member

Откуда: Sydney
Сообщений: 59
Pupkin,

Если SQL Server >= 2008, то, имхо, лучше всего будет создать filtered unique index на таблице:
CREATE UNIQUE NONCLUSTERED INDEX UQ_Contracts_IsGetter ON Contracts (IsGetter) WHERE IsGetter=1

Если < 2008, то можно также использовать AFTER триггер на insert + update, проверяющий ваш select count(*) и откатывающий транзакцию.
А чтобы в вашем варианте не ругался, нужно обернуть SELECT COUNT(*) в скалярную функцию и использовать в CHECK CONSTRAINT уже её. Но я бы не рекомендовал, ибо условие будет проверяться для каждой вставляемой строки, даже если вы вставляете сразу много.
3 окт 13, 05:43    [14915844]     Ответить | Цитировать Сообщить модератору
 Re: создание constraint  [new]
aleks2
Guest
Crimzic
Если < 2008, то можно также


Использовать Indexed View. Эффект такой же как от фильтрованного индекса.
3 окт 13, 06:44    [14915861]     Ответить | Цитировать Сообщить модератору
 Re: создание constraint  [new]
Pupkin
Member

Откуда:
Сообщений: 120
Реализовал решение обернуть SELECT COUNT(*) в скалярную функцию и использовать в CHECK CONSTRAINT уже её. Осознаю, что это (возможно) не лучшее решение, но зато для меня очень понятное.
Все работает.
Всем спасибо.
3 окт 13, 12:42    [14917688]     Ответить | Цитировать Сообщить модератору
 Re: создание constraint  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Pupkin
Осознаю, что это (возможно) не лучшее решение

Если в вашей таблице три с половиной записи — то это рабочее решение.
Но почему бы сразу не сделать нормальное решение, выбрав одно из двух предложенных.
3 окт 13, 12:56    [14917795]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить