将varchar()列限制为特定值?


94

有没有一种方法可以指定例如MS SQL Server 2008中的varchar列的4个不同值?

例如,我需要一个名为Frequency(varchar)的列,该列仅接受“每日”,“每周”,“每月”,“每年”作为可能的值

创建表时是否可以在SQL Server Management Studio中进行设置?


5
如果可以安全地假设将没有更多的有效值并且表中将有很多行,那么我会以比varchar()小和快的方式对可能的值进行编码。
Wikser 2010年

Answers:


127

您是否已经考虑过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不喜欢它。
亚当

1
此约束检查是否区分大小写?
RWendi

3
我认为您在第四行之后错过了昏迷Frequency varchar(200)
BillOverFlow

RWendi-默认的SQL Server排序规则不区分大小写,适用于数据库级别。此处的更多信息stackoverflow.com/questions/1439485/…–
jwoe

57

您需要检查约束

CHECK约束根据不基于另一列中数据的逻辑表达式确定有效值。例如,可以通过创建CHECK约束来限制薪水列的值范围,该约束仅允许范围从$ 15,000到$ 100,000的数据。这样可以防止输入超出正常工资范围的工资。

您想要类似:

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

您还可以使用标量函数实现检查约束,如上面的链接中所述,这是我更喜欢的方法。


1
这个答案也很好..为什么我们不能接受一个以上!:)
亚当

1
是的,这个更好:),为此+1
Owais Qureshi

11

就个人而言,我将其编码为tinyint并:

  • 要么:将其更改为客户端上的文本,然后检查1到4之间的约束
  • 或者:使用带有外键的查找表

原因:

  • 存储文本平均需要8个字节,tinyint需要1个字节。在数百万行中,这将有所作为。

  • 整理呢?“每日”是否与“每日”相同?进行这种比较需要资源。

  • 最后,如果您想添加“每两周一次”或“每小时一次”怎么办?仅在向查询表添加新行时,这需要更改架构。


5

当您正在编辑的表
右键- >检查约束- >添加- >键入类似Frequency IN ('Daily', 'Weekly', 'Monthly', 'Yearly')表达领域,在(名称)领域的良好约束名。
大功告成

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.