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

Откуда: Львов
Сообщений: 43
Здравствуйте.

Такой вопрос. Есть таблица с полями id1 int, id2 int, activ bit. Ключ ид1, ид2
Надо сделать так, чтобы для каждого набора id1, id2 было бы только одно поле active = 1, например:
1,1,0
1,2,1
1,3,0
2,1,1
2,2,0

Надо, чтобы не было возможности добавить запись 1,4,1 или 2,3,1.

Юникю индекс,наверное не получится,констрейнт тоже..
Только триггер?

Спасибо.
13 мар 14, 17:18    [15719224]     Ответить | Цитировать Сообщить модератору
 Re: констрейнт тригер или индекс  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Zmiy2005,

фильтрованный уникальный индекс
13 мар 14, 17:19    [15719236]     Ответить | Цитировать Сообщить модератору
 Re: констрейнт тригер или индекс  [new]
Zmiy2005
Member

Откуда: Львов
Сообщений: 43
Извините, возможно я не до конца понимаю логику работы фильтруемых индексов
В моем случае:

CREATE UNIQUE NONCLUSTERED INDEX IX_test
ON tblTest (id1, id2)
WHERE active= 1;
GO

Я дальше могу добавить запись 1,4,1 или 2,3,1.

Подскажите, как правильно написать?

Спасибо.
13 мар 14, 19:07    [15719969]     Ответить | Цитировать Сообщить модератору
 Re: констрейнт тригер или индекс  [new]
o-o
Guest
Zmiy2005,

описание задачи непонятное.
если id1, id2 -- уже ключ, то уже пары (id1, id2) -- уникальны.
ну так уже обеспечено, что тройки (id1, id2, <что угодно>) уникальны.

пример тоже света не пролил.
почему нельзя вставить 1,4,1 или 2,3,1, что нарушается-то?
13 мар 14, 19:25    [15720054]     Ответить | Цитировать Сообщить модератору
 Re: констрейнт тригер или индекс  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
o-o
если id1, id2 -- уже ключ, то уже пары (id1, id2) -- уникальны.
ну так уже обеспечено, что тройки (id1, id2, <что угодно>) уникальны.
Нужно уникальность как по {ID1,Active = 1} так и по {ID2,Active = 1}.
Zmiy2005
для каждого набора id1, id2 было бы только одно поле active = 1

ID1ID2Active
110
121
130
211
220

CREATE UNIQUE INDEX UX_ID1 ON dbo.tblTest (ID1) WHERE (Active = 1);
CREATE UNIQUE INDEX UX_ID2 ON dbo.tblTest (ID2) WHERE (Active = 1);


PS: Смотрим на TSQL и не видим разницу с описанием задачи - буржуйским по белому. Нужно понимать задачу.
А "не было возможности добавить" это императивное мышление - что никогда не было пониманием.
14 мар 14, 00:13    [15721028]     Ответить | Цитировать Сообщить модератору
 Re: констрейнт тригер или индекс  [new]
o-o
Guest
"о пользе правильной формулировки"

>>>для каждого набора id1, id2 ->
>>>CREATE UNIQUE NONCLUSTERED INDEX IX_test ON tblTest (id1, id2) WHERE active= 1;

>>>Нужно уникальность как по {ID1,Active = 1} так и по {ID2,Active = 1} ->
>>>CREATE UNIQUE INDEX UX_ID1 ON dbo.tblTest (ID1) WHERE (Active = 1);
>>>CREATE UNIQUE INDEX UX_ID2 ON dbo.tblTest (ID2) WHERE (Active = 1);

у меня вообще часто получается, что вопрос не доходит до публикации на форуме.
пока пытаюсь его сформулировать так, чтоб поняли _другие_, до _меня_ же и доходит,
и чего хотелось, и как оно в связи с этим решается
14 мар 14, 13:24    [15723509]     Ответить | Цитировать Сообщить модератору
 Re: констрейнт тригер или индекс  [new]
AO_MMM
Member [заблокирован]

Откуда:
Сообщений: 27
Zmiy2005, завязывайте с зелёным змием.

Zmiy2005
Здравствуйте.

Такой вопрос. Есть таблица с полями id1 int, id2 int, activ bit. Ключ ид1, ид2
Надо сделать так, чтобы для каждого набора id1, id2 было бы только одно поле active = 1, например:
1,1,0
1,2,1
1,3,0
2,1,1
2,2,0

Надо, чтобы не было возможности добавить запись 1,4,1 или 2,3,1.

где тут противоречие ?
почему именно 1,4,1 и 2,3,1 не должны быть добавлены ?
сами-то понимаете свою постановку задачи ?
14 мар 14, 14:08    [15723984]     Ответить | Цитировать Сообщить модератору
 Re: констрейнт тригер или индекс  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
AO_MMM
Zmiy2005, завязывайте с зелёным змием.

Zmiy2005
Здравствуйте.

Такой вопрос. Есть таблица с полями id1 int, id2 int, activ bit. Ключ ид1, ид2
Надо сделать так, чтобы для каждого набора id1, id2 было бы только одно поле active = 1, например:
1,1,0
1,2,1
1,3,0
2,1,1
2,2,0

Надо, чтобы не было возможности добавить запись 1,4,1 или 2,3,1.

где тут противоречие ?
почему именно 1,4,1 и 2,3,1 не должны быть добавлены ?
сами-то понимаете свою постановку задачи ?
Потому что для ID1=1 уже есть Active=1
и для ID1=2 тоже
14 мар 14, 14:14    [15724030]     Ответить | Цитировать Сообщить модератору
 Re: констрейнт тригер или индекс  [new]
o-o
Guest
...так Mnior же разжевал цветом выделил + ответ написал
14 мар 14, 14:25    [15724145]     Ответить | Цитировать Сообщить модератору
 Re: констрейнт тригер или индекс  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3754
CREATE UNIQUE INDEX UX_ID1 ON dbo.tblTest (ID1) WHERE (Active = 1);
14 мар 14, 14:27    [15724174]     Ответить | Цитировать Сообщить модератору
 Re: констрейнт тригер или индекс  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
o-o
у меня вообще часто получается, что вопрос не доходит до публикации на форуме.
пока пытаюсь его сформулировать так, чтоб поняли _другие_, до _меня_ же и доходит,
и чего хотелось, и как оно в связи с этим решается
Сила декларативизма, она всегда требует глубокого понимания.

Иначе ходячие императивные био-роботы, наивно думающие что обладают сознанием, а не месивом психо-программ.
14 мар 14, 20:52    [15727008]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить