簡體   English   中英

如何為SQL表列分配2個默認值?

[英]How to assign 2 default values to SQL table column?

我正在設計下面列的用戶注冊表。

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。

我可以在這里得到一些想法嗎? 任何幫助,將不勝感激。 謝謝

您需要使用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]

您可以嘗試為狀態字段添加以下約束。 如果它的工作然后將相同的應用於ROLE字段。

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

有兩種可能的方法。

  1. 檢查約束 - @ mh2017在他的回答中解釋了這一點。

看一下似乎更符合你要求的對話,但為了分享想法,我會提到 -

  1. 外鍵約束(FK) - 如果可以將User_Status和User_Role列修改為tinyint類型(或類似的數字類型),則可以只在這些列中存儲id並創建枚舉(也就是映射表)來存儲ids代表。 在User_Status上創建FK,在NCT_UserRegistration中創建User_Role以引用枚舉表。

FKC確保引用列(NCT_UserRegistration中的User_Status和User_Role)不能具有除引用列中列出的值之外的值(枚舉表中的相應id列)

完整性帖子的外鍵與檢查約束也描述了使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM