2010-07-27 73 views
1

數據庫檢查約束是MS SQLServer的爲標誌列

數據例如:

 
| Name | defaultValue | value | 
| one |  true  | valone | 
| one |  false | valtwo | 
| one |  false | valthree | 

制約臺,使得每一個「名稱」的方式後,我只能有一排用'默認值」設置爲true

回答

1

這樣創建一個計算列:

ALTER TABLE yourtable 
    ADD ValueCheck AS CASE defaultValue 
    WHEN true THEN 1 
    WHEN false THEN NULL 
    END 

,然後添加獨特CON (名稱,ValueCheck)

+0

I + 1ed this但後來意識到它不起作用。 SQL Server中的唯一約束只允許1 NULL。 – 2010-07-27 10:30:54

+0

你說得對。 :( – 2010-07-27 10:57:52

+0

如果yourtable有一個關鍵列(例如.keyid),那麼將NULL更改爲keyid上面應該可以工作 – 2010-07-27 12:28:02

0

您可以使用TRIGGER驗證此更新或插入事件的約束,並在事務無效時回滾該事務。

+0

但請確保您考慮快照隔離的影響http://sqlblog.com/blogs/hugo_kornelis/archive/tags/Isolation/default.aspx – 2010-07-27 10:41:15

1

我喜歡Michael的想法,但它只會讓你在SQL Server中爲每個名稱創造一個錯誤的值。爲了避免這種情況如何使用

ALTER TABLE yourtable 
    ADD [ValueCheck] AS 
    (case [defaultValue] when (1) then ('~Default#[email protected]') /*Magic string!*/ 
       else value end) persisted 

然後爲(Name,ValueCheck)添加唯一約束。

我假設名稱,值組合將是唯一的。如果值列不允許爲NULL,那麼使用NULL而不是魔術字符串將是更可取的,否則選擇不能出現在數據中的字符串(例如,如果值列僅允許100個字符,則爲101個字符)