限制varchar()列的特定值?

117

在MS SQL Server 2008中,是否有一种方法可以为varchar列指定4个不同的值?

例如,我需要一个名为“频率”的列(varchar),只接受“每日”、“每周”、“每月”、“每年”等可能的取值

在创建表时,是否可以在SQL Server Management Studio中设置这个限制?


5
如果可以安全地假设不会有更多有效的值,并且表中将有许多行,我会使用比 varchar() 更小更快的方式对可能的值进行编码。 - Wikser
4个回答

156

你是否已经考虑在该列上添加一个check constraint来限制值?类似于:

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

2
谢谢,这很有效。不过我必须做一个小改动,就是“Frequency IN...”也必须用括号括起来。SQL Server Studio 不知道为什么不喜欢没有括号的形式。 - Adam
1
这个约束检查区分大小写吗? - RWendi
3
我认为在第四行“Frequency varchar(200)”后面缺少了一个逗号。 - BillOverFlow
RWendi - SQL Server 的默认排序规则是不区分大小写的,这适用于数据库级别。更多信息请参见 https://dev59.com/bUnSa4cB1Zd3GeqPNmZP - jwoe

67
你需要一个检查约束

检查约束通过逻辑表达式确定有效值, 而该表达式不基于其他列中的数据。 例如,可以通过创建检查约束来限制薪资列的值范围, 以允许仅从15000美元到100000美元的数据。 这样可以防止超出常规薪资范围的薪资被输入。

你想要类似这样的东西:
ALTER TABLE dbo.Table ADD CONSTRAINT CK_Table_Frequency
    CHECK (Frequency IN ('Daily', 'Weekly', 'Monthly', 'Yearly'))

你也可以使用标量函数来实现检查约束,就像上面链接中描述的那样,这是我更喜欢的方法。


2
这个答案也很好啊,为什么我们不能接受多个呢!! :) - Adam
2
这个更好 :), 给他一个赞 - Owais Qureshi

15

个人而言,我会把它编码为tinyint类型,并:

  • 要么:在客户端上将其更改为文本,然后使用检查约束限制在1和4之间
  • 要么:使用具有外键的查找表

原因:

  • 平均需要8个字节来存储文本,而只需要1个字节来存储tinyint。在数百万行数据的情况下,这将产生巨大的差异。

  • 那么排序规则呢?"Daily"和"DAILY"是相同的吗?这种比较需要消耗资源。

  • 最后,如果您想添加"Biweekly"或"Hourly",这将需要模式更改,但您可以将新行添加到查找表中。


6

当您正在编辑表格时
右键单击 ->检查约束 ->添加 ->在表达式字段中输入类似于Frequency IN('Daily','Weekly','Monthly','Yearly')的内容和一个好的约束名称在(名称)字段中。
完成。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接