SQL Server是否等同于MySQL枚举数据类型?


Answers:


155

没有。有一个模糊的等效项:

mycol VARCHAR(10) NOT NULL CHECK (mycol IN('Useful', 'Useless', 'Unknown'))

10
为什么不使用定义有效值的表,然后使用外键约束呢?
Elaskanator

@Elaskanator我想说这最精确地回答了直接操作,而最好的解决方案可能是FK +外部表用法。
userfuser

谢谢@Elaskanator,让我想起了明显的事情...规范化数据,并停止存在枚举。
Andrew

88

我在此找到的最佳解决方案是创建一个以可能的值为主键的查找表,并为该查找表创建外键。


13
从可维护性的角度来看,比上述检查约束更好的解决方案。
HLGEM 2012年

21
与MySQL中的Enums相比,这是一个更好的解决方案。
ypercubeᵀᴹ

2
@ypercube为什么对MySQL也更好?
BenR 2014年

4
@BenRecord MySQL的枚举有几个问题:MySQL的ENUM数据类型为Evil的8个原因。我不同意100%这是邪恶的,但使用它们时必须格外小心。
ypercubeᵀᴹ

1
如果我没记错的话,@BenR也可以,在MySQL的非严格模式下,可以将无效的枚举插入为NULL。无论什么条件,我的上一个团队都有一个问题,就是在值列表中未指定值时,MySQL枚举无法插入且不会失败。查找表上的外键约束会导致失败。我同意查找表更适合MySQL。
吉姆·舒伯特



1

当我想在SQL Server中实现枚举时,发现了这种有趣的方法。

考虑到您的所有数据库枚举需求都可以通过2个中央表满足,因此该链接中以下提到的方法非常引人注目。

http://blog.sqlauthority.com/2010/03/22/sql-server-enumerations-in-relational-database-best-practice/


8
这是反模式的一种变体,称为“一个真实(查找)表”。正确的方法是为每种枚举类型使用单独的表并使用外键(如果根本不需要查找,“纯”枚举可能不是这种情况)。
Branko Dimitrijevic 2014年

2
链接页面上的注释为使用每个“枚举”的单个表提供了良好的备份,而不是此答案指定的内容
skia.heliou 2015年

4
有趣的是,大多数人会正确地拒绝这种设计,但是作者将他的文章命名为“最佳实践”。
underscore_d
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.