在SQL Server中创建枚举

2 sql sql-server enums

我试图像在MySQL中那样创建一个枚举

USE WorldofWarcraft;

CREATE TABLE [users]
(
   ID INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
   username varchar(255),
   password varchar(255),
   mail varchar (255),
   rank  ENUM ('Fresh meat', 'Intern','Janitor','Lieutenant','Supreme being')DEFAULT 'Fresh meat',
);
Run Code Online (Sandbox Code Playgroud)

但是,我发现这在SQL Server中是不可能的,所以我的问题是,如何解决这个问题?

我已经看过这篇文章

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

建议类似

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

但是,我也无法正常工作,我将如何创建默认值?

最好的祝福。

编辑:枚举的目的是要在该站点上有一个下拉列表,公会主持人可以在该站点上设置某人的等级。用户创建帐户时,默认等级为“鲜肉”。

Ivi*_*x4u 12

SQL Server中没有像MySQL中那样可用的枚举数据类型。

但使用CHECK约束枚举功能是可以实现的。

USE WorldofWarcraft;

CREATE TABLE [users]
(
   ID INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
   username nvarchar(255),
   password nvarchar(255),
   mail nvarchar (255),
   [rank]  nvarchar (255) NOT NULL CHECK ([rank] IN('Fresh meat', 'Intern','Janitor','Lieutenant','Supreme being')) DEFAULT 'Fresh meat'
);

Run Code Online (Sandbox Code Playgroud)


a_h*_*ame 5

最好适当地规范模型:

create table user_rank
(
   id integer primary key, -- no identity, so you can control the values
   rank varchar(20) not null unique
);

insert into user_rank (id, rank)
values
  (1, 'Fresh Meat'),
  (2, 'Intern'),
  (3, 'Janitor'),
  (4, 'Lieutenant'),
  (5, 'Supreme being');

CREATE TABLE [users]
(
   ID INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
   username varchar(255),
   password varchar(255),
   mail varchar (255),
   rank integer not null default 1, 
   constraint fk_user_rank foreign key (rank) references user_rank (id)
);
Run Code Online (Sandbox Code Playgroud)

您可以通过查询user_rank表轻松地填充网站上的下拉列表。

  • 很难不同意。这对于规范化绝对没有任何作用(因为 enum 在幕后以更好的方式执行此操作),它只是使 int 到 string 表用于将其存储在压缩的形式可变而不是不可变中,因此查询优化器始终必须假设它可以在交易过程中发生变化。 (3认同)
  • 非常感谢马先生。 (2认同)