2009-09-16 60 views

回答

110

它没有。有一个模糊等价:

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

如何做到这一点的SSMS? – EgoPingvina 2017-10-03 19:49:15

+0

@EgoPingvina:你应该在一个问题中提出这个问题,而不是评论。 – chaos 2017-10-18 19:51:38

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

GO 

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

-- etc... 

表现在哪里的问题,仍然使用硬值。

68

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

+7

从可维护性角度来看,比上面显示的检查约束更好的解决方案。 – HLGEM 2012-06-21 13:59:40

+14

这是一个比Enums更好的解决方案 - 在MySQL中也是如此。 – 2012-06-28 09:29:51

+2

@ypercube为什么它对MySQL更好呢? – BenR 2014-11-17 18:52:26

1

当我想在SQL Server中实现枚举时找到了这个有趣的方法。

考虑到所有的数据库枚举需求都可以用2个中心表来满足,下面链接中提到的方法非常有吸引力。

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

+6

这是一种反模式的变体,被称为“one true (查找表”。正确的做法是为每个枚举类型使用单独的表并使用外键(如果您需要查找,可能不是“纯”枚举的情况)。 – 2014-09-04 13:22:41

+2

链接页面上的注释为每个“枚举”使用单独的表格提供了很好的备份,而不是这个答案指定的内容 – 2015-04-13 20:14:06

+4

大多数人会很肯定地忽略这种设计是非常有趣的,但作者将他的文章命名为“最佳实践” 。 – 2016-11-16 13:11:17