2015-06-12 7 views
0

Во-первых, у меня есть простой [SomeType] стол, с колонками [ID] и [Name].SQL Constraint на значение столбца в зависимости от значения другого столбца

Также у меня есть [SomeTable] таблицы с полями, как:

[ID], 
[SomeTypeID] (FK), 
[UserID] (FK), 
[IsExpression] 

Наконец, я должен сделал на уровне базы данных ограничение, которое:

  • для конкретных [SomeType] идентификаторов (фактически, для всех, кроме один),
  • для таких же UserID,
  • только одна запись должна иметь [IsExpression] равно 1
    (IsExpression имеет BIT типа)

Я не знаю, если это сложное состояние или нет, но я понятия не имею, как писать. Как бы вы реализовали такое ограничение?

ответ

1

Вы можете сделать это с фильтрованной индекс:

CREATE UNIQUE NONCLUSTERED INDEX [IDX_SomeTable] ON [dbo].[SomeTable] 
(
    [UserID] ASC 
) 
WHERE ([SomeTypeID] <> 1 AND [IsExpression] = 1) 

или:

CREATE UNIQUE NONCLUSTERED INDEX [IDX_SomeTable] ON [dbo].[SomeTable] 
(
    [UserID] ASC, 
    [SomeTypeID] ASC 
) 
WHERE ([SomeTypeID] <> 1 AND [IsExpression] = 1) 

Зависит от того, что вы пытаетесь достичь. Только один [IsExpression] = 1 у одного пользователя без учета [SomeTypeID] или вы хотите только один [IsExpression] = 1 внутри одного пользователя и один [SomeTypeID].

+0

будет индексировать, чтобы избежать добавления новой записи с также [IsExpression] true, если у этого пользователя уже есть IsExpression true для этого SomeType? – prvit

+0

@prvit, второй индекс - именно то, что вы хотите –

+0

@prvit да, если индекс создается как 'UNIQUE', значит, вы не можете вводить какие-либо повторяющиеся записи в поля, которые являются частью индекса. –

Смежные вопросы