SQL Server相当于MySQL枚举数据类型?

Pat*_*ick 124 sql t-sql sql-server types sql-server-2008

SQL Server 2008是否具有类似MySQL的数据类型enum

cha*_*aos 145

它没有.有一个模糊的等价物:

mycol VARCHAR(10) NOT NULL CHECK (mycol IN('Useful', 'Useless', 'Unknown'))
Run Code Online (Sandbox Code Playgroud)

  • 为什么不使用定义有效值的表,然后使用外键约束呢? (8认同)
  • @Elaskanator我想说这最准确地回答了直接OP,而最好的解决方案可能是FK+外部表的使用。 (3认同)
  • @Elaskanator通常枚举值首先在应用程序代码中定义(例如C#`enum`),而如果它们使用表FK引用,那么那些所谓的静态枚举条目可能会在运行时被修改,这是不希望的(并且SQL Server不支持不可变表的概念),最后,如果您有大量只有几个值的枚举,那么您最终将向数据库添加大量表。更不用说插入/删除数据时由于 FK 约束检查而导致的额外 IO 读取,而“CHECK CONSTRAINT”速度要快得多,并且不会导致数据库对象垃圾邮件。 (2认同)
  • 我同意@dai 的观点。我曾经使用代码表,但我认为它们太过分了。我喜欢 CHECK 功能和 varchar。它允许您在 C# 中使用静态枚举,而无需一堆花哨的解决方法。在性能方面,sqlserver 完全能够对字符串进行索引,几乎与整数或小整数一样。与额外的编码复杂性相比,性能增益是最小的。时间就是金钱。 (2认同)

小智 85

我在这里找到的最佳解决方案是创建一个查找表,其中可能的值作为主键,并为查找表创建一个外键.

  • 这是一个比Enums更好的解决方案 - 在MySQL中也是如此. (21认同)
  • 从可维护性角度看,比上面显示的检查约束更好的解决方案. (11认同)
  • @BenRecord MySQL的枚举有几个问题:[为什么MySQL的ENUM数据类型是邪恶的8个原因](http://komlenic.com/244/8-reasons-why-mysqls-enum-data-type-is-evil/ ).我不同意它是邪恶的,但你在使用它们时必须格外小心. (4认同)
  • @ypercube为什么MySQL也更好? (2认同)
  • @BenR 如果我没记错的话,在 MySQL 的非严格模式下,无效的枚举可以作为 NULL 插入。无论情况如何,当值未在值列表中指定时,我的前一个团队遇到了 MySQL 枚举未插入和 * 未失败 * 的问题。查找表上的外键约束会导致失败。我同意查找表更适合 MySQL。 (2认同)

小智 5

CREATE FUNCTION ActionState_Preassigned()
RETURNS tinyint
AS
BEGIN
    RETURN 0
END

GO

CREATE FUNCTION ActionState_Unassigned()
RETURNS tinyint
AS
BEGIN
    RETURN 1
END

-- etc...
Run Code Online (Sandbox Code Playgroud)

在性能很重要的地方,仍然使用硬值。


Jon*_*mit 5

恕我直言,查找表是要走的路,具有参照完整性。但前提是您通过以下示例避免“邪恶的魔法数字”: 使用 T4 从数据库查找表生成枚举

玩得开心!