SQLServer2008是否具有像 MySQL 的 enum那样的数据类型?
enum
不是这样的,有一个模糊的等价物:
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'))
也许最好的解决方案是一个简单的查找表(什么是查找表?):
User.Role是这里的外键,而 Role.Type是它引用的主键。在那个表中,你会得到以下值:
User.Role
Role.Type
nvarchar(15)
Role
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
您可以实现一个像这样的查找表: 在 SQLServer 中创建枚举