等效于 MySQL 枚举数据类型的 SQLServer? ?

SQLServer2008是否具有像 MySQL 的 enum那样的数据类型?

170934 次浏览

不是这样的,有一个模糊的等价物:

mycol VARCHAR(10) NOT NULL CHECK (mycol IN('Useful', 'Useless', 'Unknown'))
CREATE FUNCTION ActionState_Preassigned()
RETURNS tinyint
AS
BEGIN
RETURN 0
END


GO


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


-- etc...

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

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

恕我直言,使用参照完整性查找表才是正确的选择。 但前提是你要通过下面这个例子来避免“邪恶魔法数字”: 使用 T4从数据库查找表生成枚举

玩得开心!

你可以试试

ALTER TABLE dbo.yourTable
ADD CONSTRAINT yourColumn CHECK(yourColumn IN('XL','L','M','S','XS'))

也许最好的解决方案是一个简单的查找表(什么是查找表?):

解决方案

SQLServerManagementStudio (SSMS)

sql server enum implementation

User.Role是这里的外键,而 Role.Type是它引用的主键。在那个表中,你会得到以下值:

values for enum table

  • 两个表中的 必须匹配的类型。在本例中,该类型为: nvarchar(15)
  • 如果您试图在 User.Role处添加一个与 Role表中可用的值不同的值,就会得到一个错误。

enter image description here

SQL 代码

CREATE TABLE [dbo].[User](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Username] [nvarchar](50) NOT NULL,
[Email] [nvarchar](75) NOT NULL,
[Password] [nvarchar](25) NOT NULL,
[Role] [nvarchar](15) NOT NULL,
CONSTRAINT [PK_User] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO


ALTER TABLE [dbo].[User]  WITH CHECK ADD  CONSTRAINT [FK_User_Role] FOREIGN KEY([Role])
REFERENCES [dbo].[Role] ([Type])
GO


ALTER TABLE [dbo].[User] CHECK CONSTRAINT [FK_User_Role]
GO
CREATE TABLE [dbo].[Role](
[Type] [nvarchar](15) NOT NULL,
CONSTRAINT [PK_Role] PRIMARY KEY CLUSTERED
(
[Type] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO

解决方案2

您可以实现一个像这样的查找表: 在 SQLServer 中创建枚举