如何为SQL表列分配2个默认值?

时间:2017-02-07 05:26:51

标签: sql sql-server alter-table

我正在使用以下列设计用户注册表。

CREATE TABLE [dbo].[NCT_UserRegistration]
(
    [User_Id] [int] IDENTITY(1,1) NOT NULL,
    [User_EmailId] [varchar](255) NULL,
    [User_Password] [varchar](512) NULL,
    [User_Name] [varchar](255) NULL,
    [User_MobileNum] [varchar](20) NULL,
    [User_Status] [varchar](15) NULL,
    [User_Role] [varchar](20) NULL,
    [User_CreatedDate] [timestamp] NULL,
    [User_UpdatedDate] [datetime] NULL,
    [Name] [varchar](30) NULL
)

我对状态和角色的要求如下。

  • status VARCHAR(15)索引,ENABLED枚举,已禁用。
  • role VARCHAR(20) SUPER_ADMIN和PROJECT_ADMIN的枚举

我从上面了解到的状态只应该是EnabledDisabled,同样也适用于角色。如何设计我的表以确保它只需要这两个值?也有任何方式,例如,如果我提供1然后它是ENABLED和0为DISABLED。

我可以在这里得到一些想法吗?任何帮助,将不胜感激。谢谢

3 个答案:

答案 0 :(得分:6)

您需要使用CHECK CONSTRAINT来限制特定值

CREATE TABLE [dbo].[NCT_UserRegistration](
    [User_Id] [int] IDENTITY(1,1) NOT NULL,
    [User_EmailId] [varchar](255) NULL,
    [User_Password] [varchar](512) NULL,
    [User_Name] [varchar](255) NULL,
    [User_MobileNum] [varchar](20) NULL,
    [User_Status] [varchar](15) NULL CONSTRAINT chk_Status CHECK ([User_Status] IN ('ENABLED', 'DISABLED')),
    [User_Role] [varchar](20) NULL CONSTRAINT chk_Role CHECK ([User_Role] IN ('SUPER_ADMIN','DISABLED')),
    [User_CreatedDate] [timestamp] NULL,
    [User_UpdatedDate] [datetime] NULL,
    [Name] [varchar](30) NULL

)

对于枚举,您必须在前端处理或从表中删除值时进行处理,这是额外的步骤。

SELECT CASE WHEN [User_Status] = 1 THEN 'ENABLED' WHEN [User_Status] = 0 THEN 'DISABLED' END As UserStratus
FROM [dbo].[NCT_UserRegistration]

答案 1 :(得分:1)

您可以尝试为状态字段添加以下约束。如果它正常工作,则将其应用于ROLE字段。

alter table NCT_UserRegistration
    add (STATUS VARCHAR(15) default 'ENABLED',
         constraint conSTATUS check (STATUS in ('ENABLED', 'DISABLED')))

答案 2 :(得分:1)

有两种可能的方法。

  1. 检查约束 - @ mh2017在他的回答中解释了这一点。
  2. 看一下似乎更符合您要求的对话,但仅仅为了分享想法,我会提到 -

    1. 外键约束(FK) - 如果可以将User_Status和User_Role列修改为tinyint类型(或类似的数字类型),则可以只在这些列中存储id并创建枚举(也就是映射表)到存储ID代表的内容。 在User_Status上创建FK,在NCT_UserRegistration中创建User_Role以引用枚举表。
    2. FKC确保引用列(NCT_UserRegistration中的User_Status和User_Role)不能具有除引用列中列出的值之外的值(枚举表中的相应id列)

      Foreign key vs check constraint for integrity帖子还介绍了使用FK而非检查约束的一些好处

      以下是显示外键方法的示例代码

        CREATE TABLE [dbo].[NCT_UserRegistration](
          [User_Id] [int] IDENTITY(1,1) NOT NULL,
          [User_EmailId] [varchar](255) NULL,
          [User_Password] [varchar](512) NULL,
          [User_Name] [varchar](255) NULL,
          [User_MobileNum] [varchar](20) NULL,
          [User_Status] tinyint NULL, -- I changed this from varchar to tinyint
          [User_Role] tinyint  NULL, -- I changed this from varchar to tinyint
          [User_CreatedDate] [timestamp] NULL,
          [User_UpdatedDate] [datetime] NULL,
          [Name] [varchar](30) NULL
      )
      
      create table StatusEnumeration
      (
          StatusId tinyint,
          Description varchar(10)
          constraint pk_StatusEnumeration__StatusId primary key clustered (StatusId)
      )
      
      insert into StatusEnumeration(StatusId, Description)
      values
      (0, 'Disabled'),
      (1, 'Enabled')
      
      
      create table RoleEnumeration
      (
          RoleId tinyint,
          Description varchar(20)
          constraint pk_RoleEnumeration__RoleId primary key clustered (RoleId)
      )
      
      insert into RoleEnumeration(RoleId, Description)
      values
      (0, 'SUPER_ADMIN '),
      (1, 'PROJECT_ADMIN')
      
      alter table NCT_UserRegistration
      add constraint fk_NCT_UserRegistration__StatusEnumeration_StatusId foreign key (User_Status)
          references StatusEnumeration (StatusId)
      go
      
      alter table NCT_UserRegistration
      add constraint fk_NCT_UserRegistration__RoleEnumeration_RoleId foreign key (User_Role)
          references RoleEnumeration (RoleId)
      go