2010-03-14 114 views
76

有沒有一種方法可以爲MS SQL Server 2008中的varchar列指定例如4個不同的值?將varchar()列限制爲特定值?

例如,我需要一列稱爲頻率(VARCHAR)只接受「每日」,「每週」,「每月」,「每年」的可能值

這是可能在SQL Server中設置Management Studio在創建表時?

+4

如果可以安全地假設不會有更多有效的值,並且表中會有很多行,我會用比varchar()更小更快的東西來編碼可能的值。 – Wikser 2010-03-14 07:16:53

回答

93

你是否已經着眼於在該列上添加一個check constraint這將限制值?喜歡的東西:

CREATE TABLE SomeTable 
(
    Id int NOT NULL, 
    Frequency varchar(200), 
    CONSTRAINT chk_Frequency CHECK (Frequency IN ('Daily', 'Weekly', 'Monthly', 'Yearly')) 
) 
+2

謝謝 - 這工作很好。我必須做的一個小改變是,「頻率IN ....」也必須包含在括號中。沒有出於某種原因,SQL服務器工作室不喜歡它。 – Adam 2010-03-14 08:25:25

+1

這個約束檢查是否區分大小寫? – RWendi 2013-05-01 09:27:48

+3

我想你錯過了第四行'Frequency varchar(200)' – BillOverFlow 2016-09-29 01:09:32

45

你想要一個check constraint

CHECK約束確定的有效值 來自未 基於在另一列中的數據的邏輯表達式。例如,對於 示例, 工資列的值範圍可能受到 的限制,創建CHECK約束, 只允許範圍從 $ 15,000到$ 100,000的數據。這 防止超出正常工資範圍輸入 的工資。

你想要的東西,如:

ALTER TABLE dbo.Table ADD CONSTRAINT CK_Table_Frequency 
    CHECK (Frequency IN ('Daily', 'Weekly', 'Monthly', 'Yearly')) 

您也可以實現檢查約束與標量函數,如上面的鏈接,這是我喜歡做說明。

+0

這個答案也很好..爲什麼我們不能接受多個! :) – Adam 2010-03-14 08:26:28

+1

是這一個更好:),爲+1 – 2012-12-17 04:40:34

4

當您正在編輯一個表
右鍵 - >檢查約束 - >添加 - >輸入表達式場像Frequency IN ('Daily', 'Weekly', 'Monthly', 'Yearly')和(名稱)領域的良好約束名。
你完成了。

11

就個人而言,我想它的代碼爲TINYINT和:

  • 或者:更改到客戶端上的文本,檢查
  • 1和4之間的約束或:使用查找表的外鍵

原因:

  • 這將需要平均8個字節存儲文本,對於t 1個字節inyint。數百萬行,這將有所作爲。

  • 排序規則如何? 「每日」與「每日」相同嗎?它需要資源來做這種比較。

  • 最後,如果您要添加「雙週」或「每小時」,該怎麼辦?當您只需將新行添加到查找表時,就需要更改架構。