如何将 2 个默认值分配给 SQL table 列?
How to assign 2 default values to SQL table column?
我正在设计用户注册 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、DISABLED的枚举。
role VARCHAR(20)
SUPER_ADMIN 和 PROJECT_ADMIN 的枚举
我从上面的理解是状态应该只取 Enabled
或 Disabled
并且角色也一样。我如何设计 table 以确保它只采用这两个值?还有什么办法,例如,如果我提供 1,那么它是启用的,0 是禁用的。
我可以在这里得到一些想法吗?任何帮助,将不胜感激。谢谢
您需要使用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
)
对于枚举,您必须在前端或从 table 检索值时进行处理,这是一个额外的步骤。
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')))
有两种可能的方法。
- 检查约束 - @mh2017 在他的回答中对此进行了很好的解释。
看对话好像比较符合你的要求,不过为了交流思路,我提一下-
- 外键约束 (FK) - 如果可以将 User_Status 和 User_Role 列修改为 tinyint 类型(或类似的数字类型),则可以仅将 id 存储在这些并创建枚举(又名映射表)来存储 id 代表的内容。
在 NCT_UserRegistration 中的 User_Status 和 User_Role 上创建 FK 以引用枚举表。
FKC 确保引用列(User_Status 和 NCT_UserRegistration 中的 User_Role)不能具有引用列中列出的值以外的值(枚举中的相应 id 列)表)
此 Foreign key vs check constraint for integrity post 还描述了使用 FK over check 约束的一些好处
这是显示外键方法的示例代码
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
我正在设计用户注册 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、DISABLED的枚举。role VARCHAR(20)
SUPER_ADMIN 和 PROJECT_ADMIN 的枚举
我从上面的理解是状态应该只取 Enabled
或 Disabled
并且角色也一样。我如何设计 table 以确保它只采用这两个值?还有什么办法,例如,如果我提供 1,那么它是启用的,0 是禁用的。
我可以在这里得到一些想法吗?任何帮助,将不胜感激。谢谢
您需要使用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
)
对于枚举,您必须在前端或从 table 检索值时进行处理,这是一个额外的步骤。
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')))
有两种可能的方法。
- 检查约束 - @mh2017 在他的回答中对此进行了很好的解释。
看对话好像比较符合你的要求,不过为了交流思路,我提一下-
- 外键约束 (FK) - 如果可以将 User_Status 和 User_Role 列修改为 tinyint 类型(或类似的数字类型),则可以仅将 id 存储在这些并创建枚举(又名映射表)来存储 id 代表的内容。 在 NCT_UserRegistration 中的 User_Status 和 User_Role 上创建 FK 以引用枚举表。
FKC 确保引用列(User_Status 和 NCT_UserRegistration 中的 User_Role)不能具有引用列中列出的值以外的值(枚举中的相应 id 列)表)
此 Foreign key vs check constraint for integrity post 还描述了使用 FK over check 约束的一些好处
这是显示外键方法的示例代码
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