Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
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] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Использовать Indexed View. Эффект такой же как от фильтрованного индекса. |
||
3 окт 13, 06:44 [14915861] Ответить | Цитировать Сообщить модератору |
Pupkin Member Откуда: Сообщений: 120 |
Реализовал решение обернуть SELECT COUNT(*) в скалярную функцию и использовать в CHECK CONSTRAINT уже её. Осознаю, что это (возможно) не лучшее решение, но зато для меня очень понятное. Все работает. Всем спасибо. |
3 окт 13, 12:42 [14917688] Ответить | Цитировать Сообщить модератору |
Гость333 Member Откуда: Сообщений: 3683 |
Если в вашей таблице три с половиной записи — то это рабочее решение. Но почему бы сразу не сделать нормальное решение, выбрав одно из двух предложенных. |
||
3 окт 13, 12:56 [14917795] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |