【问题标题】:Restrict varchar() column to specific values?将 varchar() 列限制为特定值?
【发布时间】:2017-02-09 05:42:38
【问题描述】:

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

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

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

【问题讨论】:

  • 如果可以安全地假设不再有任何有效值并且表中会有很多行,我会将可能的值编码为比 varchar() 更小更快的值.

标签: sql sql-server-2008 ssms


【解决方案1】:

您是否已经考虑在该列上添加check constraint 来限制值?类似的东西:

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

【讨论】:

  • 谢谢 - 这很好用。我必须做的一个小改动是“Frequency IN....”也必须用括号括起来。 SQL Server Studio 无缘无故不喜欢它。
  • 此约束检查是否区分大小写?
  • 我想你在第 4 行之后错过了昏迷 Frequency varchar(200)
  • RWendi - 默认 SQL Server 排序规则不区分大小写,适用于数据库级别。更多信息在这里stackoverflow.com/questions/1439485/…
【解决方案2】:

你想要一个check constraint

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

你想要这样的东西:

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

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

【讨论】:

  • 这个答案也很好..为什么我们不能接受多个!! :)
  • 是的,这个更好:),+1
【解决方案3】:

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

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

原因:

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

  • 排序规则呢? “每日”和“每日”一样吗?进行这种比较需要资源。

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

【讨论】:

    【解决方案4】:

    编辑表格时
    右键单击 -> 检查约束 -> 添加 -> 在表达式字段中键入 Frequency IN ('Daily', 'Weekly', 'Monthly', 'Yearly') 之类的内容,在 (Name) 字段中键入一个好的约束名称。
    你已经完成了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-26
      • 1970-01-01
      • 1970-01-01
      • 2016-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多