【问题标题】:Create enum in SQL Server在 SQL Server 中创建枚举
【发布时间】:2019-02-12 19:51:56
【问题描述】:

在 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',
);

这在 SQL Server 中是不可能的,那么有什么替代方案?

我看过这篇文章

SQL Server equivalent to MySQL enum data type?

推荐类似的东西

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

如何获得这项工作并创建一个默认值?


枚举的目的是能够将其与网站上的图形下拉菜单联系起来,该下拉菜单向用户提供值并预先指定默认值。

【问题讨论】:

  • 您可以添加default constraint
  • 老实说,我认为它完全是best to ignore ENUM types 并在您的应用程序中处理验证,而不是在您的数据库中。也许这是因祸得福。
  • 我会改用一个 INT 值,并将其设为具有 ID 和描述等列的 [Rank] 表的外键。
  • 根据您的编辑,您似乎只需要一个域表(通常随便称为查找表),由带有外键的用户表引用。不要使用IDENTITY,而是使用您控制的值,这样您就可以在您的应用程序代码中维护一个始终与数据库同步的枚举。该表还可以包含一个指示符,指示哪一行是所需的默认值。
  • 我也同意外键方法会更好,但如果你仍然需要,这是检查约束的语法:... rank varchar(250) NOT NULL CONSTRAINT check_rank CHECK (rank IN('Fresh meat', 'Intern','Janitor','Lieutenant','Supreme being') ) DEFAULT 'Fresh meat' ...

标签: sql sql-server enums


【解决方案1】:

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

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

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'
);

【讨论】:

    【解决方案2】:

    最好正确规范化你的模型:

    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)
    );
    

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

    【讨论】:

    • 我要补充一点,id 值是标志值,例如 (0, 1, 2,4,8,16 ... )允许图形程序以andor 的值进行多选。此外,在某些情况下,使用 0 作为 C# 的默认值,默认情况下会自动关联实例化;视情况而定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多