2010-04-19 65 views
3

我想添加一些類型的業務邏輯約束到一個表,但不知道如何/在哪裏。我應該如何在Sql Server中執行此操作(業務邏輯)?約束?

我有一個表格,包含以下字段。

  • ID INTEGER IDENTITY
  • HubId INTEGER
  • 類別編號INTEGER
  • IsFeatured位
  • 富NVARCHAR(200)

所以,我希望的是,每個hubId + categoryId只能有一個有特色的東西。

eg. 
1, 1, 1, 1, 'blah' -- Ok. 
2, 1, 2, 1, 'more blah' -- Also Ok 
3, 1, 1, 1, 'aaa' -- constraint error 
4, 1, 1, 0, 'asdasdad' -- Ok. 
5, 1, 1, 0, 'bbbb' -- Ok. 

etc. 

所以要插入的第三行將失敗,因爲該集線器AND類別已經有一個特色的東西。

這可能嗎?

+0

可能重複的http:// stackoverflow.com/questions/2587151/combining-the-unique-and-check-constraints – gbn 2010-04-19 05:21:43

回答

3

您使用數據庫約束來保護數據。對我來說,業務邏輯計算或複雜的邏輯或行到行處理:不是唯一約束

的味道在這種情況下:

  1. 你可以使用觸發器插入後檢查
  2. 限定過濾IsFeatured = 1到上HubId,類別ID索引視圖,IsFeatured
  3. 使用filtered index因爲你具有SQL Server 2008(其類似於索引視圖)

我會選擇3,親自

PS:你在哪裏提到articleID?

而且這個問題:Combining the UNIQUE and CHECK constraints

編輯:

基本上,你會做

CREATE UNIQUE INDEX IX_Foo ON Mytable (HubId, CategoryId) WHERE IsFeatured = 1 

所以唯一現在檢查上(HubId,類別編號)爲數據的子集IsFeatured = 1

+0

articleId是一個錯誤。我已經修好了,在上面。所以..一個過濾的索引..聽起來很有趣... brb(讀起來它)..嗯。我認爲我的頭腦剛剛好。你能詳細說明過濾後的索引嗎?例如。這是'數據子集'還是'異構數據'?我覺得這麼愚蠢:( – 2010-04-19 05:26:43

+0

..因爲這是一個索引,我仍然需要AFTER插入(和更新)觸發器,對嗎?(和索引只加速選擇查詢,在觸發器中)。 – 2010-04-19 06:50:13

+0

..以及如何使用檢查約束+過濾索引?(如果可能,我認爲檢查約束應該用於觸發器) – 2010-04-19 07:04:18

相關問題