2015-06-12 81 views
0

首先,我有簡單的[SomeType]表,其中列[ID][Name]SQL對列值的約束取決於其他列的值

我也有[SomeTable]表,與像場:

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

最後,我不得不數據庫層上做了約束:

  • 混凝土[SomeType]的ID(實際上,爲所有,但一個),
  • 相同UserID,
  • 只有一個條目應該有[IsExpression]等於1
    IsExpressionBIT型)

我不知道,如果是病情複雜或沒有,但我不知道怎麼寫。你將如何實現這樣的約束?

回答

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的情況下添加新條目,如果此用戶對此SomeType已具有IsExpression true? – prvit

+0

@prvit,第二個索引正是你想要的 –

+0

@prvit是的,如果一個索引被創建爲'UNIQUE',那麼這意味着你不能輸入任何重複的記錄到索引的一部分。 –