【问题标题】:Does SQL Server 2005 have an equivalent to MySql's ENUM data type?SQL Server 2005 是否有与 MySql 的 ENUM 数据类型等价的数据类型?
【发布时间】:2010-09-20 17:44:58
【问题描述】:

我正在做一个项目,我想将一些容易枚举的信息存储在一个表中。 MySql 的枚举数据类型正是我想要的:http://dev.mysql.com/doc/refman/5.0/en/enum.html。 SQL Server 2005 中是否有等价物?

我知道我可以将可能的值存储在带有键的类型表中,但我宁愿不必链接回它进行描述。我们的数据库标准不允许我们链接非整数或唯一标识符字段,因此也无法将可能的键存储为字符。

【问题讨论】:

    标签: mysql database sql-server-2005 enums


    【解决方案1】:

    这对你有用吗?

    来自http://blechie.com/wtilton/archive/2007/08/24/303.aspx

    创建表...

    MySQL:

    ColumnName ENUM('upload', 'open', 'close', 'delete', 'edit', 'add')
       DEFAULT 'open'
    

    SQL 服务器:

    ColumnName varchar(10) 
       CHECK(ColumnName IN ('upload', 'open', 'close', 'delete', 'edit', 'add')) 
       DEFAULT 'open'
    

    【讨论】:

    • 这对我有用。还有一个问题:是否有一种简单的方法可以在不选择约束的情况下判断枚举的有效值是什么?我知道可能没有,我必须以此为基础做出决定。
    • 我不确定您所说的“选择”约束是什么意思,但您也许可以将此系统查询的结果包装成可用于您需要的东西。从 sys.check_constraints 中选择定义,其中 [name]='yourConstraintName'
    • 对于 ENUM 和 CHECK 约束,您可以查询系统表并获得一个字符串,该字符串具有指定值列表的完整语法。然后你必须解析它以获取可用格式的列表。像查询数据一样查询元数据非常不方便。
    • 这从存储角度来看是不一样的,维护性较差。
    【解决方案2】:

    MySQL 的 ENUM 数据类型的一个特点是它在每一行的值列表中只存储一个数字索引,而不是字符串本身。因此,它通常更具存储效率。此外,当您按 ENUM 列排序时,默认行为是按数字索引排序,因此按 ENUM 中元素的顺序。

    Nikki9696 建议使用带有 CHECK 约束的 VARCHAR 列。这满足了将值限制为某个允许值的短列表,但它不模拟存储效率或特殊的排序顺序。

    获得这两种行为的一种方法是将列声明为一个整数外键到一个查找表中,您可以在其中存储每个允许的字符串。

    【讨论】:

    • 一个比我发布的更好的选择,我同意。
    • 不错的选择。谢谢。
    • 我很困惑。这不正是问题的作者说他不想做的事情吗(在最后一段中)?
    • @JeffreyBlake,关键是你不能像整数一样高效地存储,同时访问字符串标签而不进行连接。
    • @BillKarwin,对。这是选择此选项的正当理由(并且确实消除了 Nikki 回答的大部分吸引力)。我只是想确保我阅读正确,因为它让我印象深刻的是“我想做TaskX,但不喜欢MethodY”是“Do MethodY”。我想不同之处在于你给出了充分的理由,使它更像是“嗯,有 MethodW,但它没有多大帮助,所以即使你不喜欢它,你也应该使用 MethodY”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多