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

Ada*_*dam 91 sql ssms sql-server-2008

有没有办法为MS SQL Server 2008中的varchar列指定4个不同的值?

例如,我需要一个名为Frequency(varchar)的列,它只接受'Daily','Weekly','Monthly','Yearly'作为可能的值

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

Ash*_*pta 125

您是否已经考虑在check constraint该列上添加限制值的列?就像是:

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

  • 我认为你在第4行"频率变量(200)"之后错过了昏迷 (3认同)
  • 谢谢 - 这很有效.我必须做的一个小改动是"频率输入......"也必须括在括号中.没有出于某种原因,SQL server studio不喜欢它. (2认同)

Mic*_*tta 51

你想要一个检查约束.

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

你想要的东西:

ALTER TABLE dbo.Table ADD CONSTRAINT CK_Table_Frequency
    CHECK (Frequency IN ('Daily', 'Weekly', 'Monthly', 'Yearly'))
Run Code Online (Sandbox Code Playgroud)

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

  • 这个答案也很好..为什么我们不能接受多个!!:) (2认同)
  • 是的,这个更好:),+1 (2认同)

gbn*_*gbn 11

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

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

原因:

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

  • 整理怎么样?"每日"与"每日"相同吗?进行这种比较需要资源.

  • 最后,如果你想添加"Biweekly"或"Hourly"怎么办?当您只需将新行添加到查找表时,这需要更改架构.


Den*_*s K 5

编辑表时,
右键单击->检查约束->添加-> Frequency IN ('Daily', 'Weekly', 'Monthly', 'Yearly')在表达式字段中键入类似内容,并在(名称)字段中键入良好的约束名称。
大功告成