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

问题描述 投票:0回答:5
有没有办法指定,例如 MS SQL Server 2008 中 varchar 列的 4 个不同值?

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

创建表时可以在 SQL Server Management Studio 中设置吗?

sql sql-server-2008 ssms
5个回答
156
投票
您是否已经考虑过在该列上添加

check constraint

 来限制值?比如:

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

67
投票
您需要一个

检查约束

CHECK 约束确定有效值 从不是的逻辑表达式 基于另一列中的数据。为了 例如,a 的值范围 工资栏可以限制为 创建一个 CHECK 约束 仅允许数据范围为 15,000 美元到 100,000 美元。这 阻止输入工资 超出正常工资范围。

你想要这样的东西:

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

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


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

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

  • 存储文本平均需要 8 个字节,tinyint 需要 1 个字节。超过数百万行,这将会产生影响。

  • 整理怎么样? “每日”和“每日”一样吗?进行这种比较需要资源。

  • 最后,如果你想添加“双周”或“每小时”怎么办?当您只需向查找表添加新行时,这需要更改架构。


6
投票
当您编辑表格时

右键单击 -> 检查约束 -> 添加 -> 在表达式字段中输入类似
Frequency IN ('Daily', 'Weekly', 'Monthly', 'Yearly')

 的内容,并在(名称)字段中输入一个好的约束名称。
你完成了。


0
投票
您也可以使用

ENUM

,如下所示:

Frequency ENUM('Daily', 'Weekly', 'Monthly', 'Yearly')
    
© www.soinside.com 2019 - 2024. All rights reserved.