SQL Server的唯一键和唯一索引会将空值(NULL)也算作重复值
我们先在SQL Server数据库中,建立一张Students表:
CREATE TABLE [dbo].[Students]( [ID] [int] IDENTITY(1,1) NOT NULL, [StudentCode] [nvarchar](50) NULL, [Name] [nvarchar](50) NULL, [Age] [int] NULL, [Sex] [nvarchar](5) NULL, CONSTRAINT [PK_Students] PRIMARY KEY CLUSTERED ( [ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY], CONSTRAINT [IX_UniqueStudentCode] UNIQUE NONCLUSTERED ( [StudentCode] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO
该表的主键是列ID,该表的唯一键IX_UniqueStudentCode要求列StudentCode不能有重复值,但是列StudentCode可以为空值(NULL)。
首先我们插入四条数据到Students表中:
INSERT INTO [dbo].[Students]([StudentCode],[Name],[Age],[Sex]) VALUES (N'S001',N'Jim',15,N'M'), (N'S002',N'Tom',16,N'F'), (N'S003',N'Bill',15,N'M'), (NULL,N'Jerry',15,N'M')
可以看到我们在最后第四条数据中,给列StudentCode插入了空值(NULL)。
接着我们再插入一条列StudentCode为空值(NULL)的数据到Students表:
INSERT INTO [dbo].[Students]([StudentCode],[Name],[Age],[Sex]) VALUES (NULL,N'Clark',16,N'M')
会发现SQL Server报错,错误如下:
Msg 2627, Level 14, State 1, Line 1
Violation of UNIQUE KEY constraint 'IX_UniqueStudentCode'. Cannot insert duplicate key in object 'dbo.Students'. The duplicate key value is (<NULL>).
The statement has been terminated.
从错误中,我们可以看到,我们插入的数据违反了唯一键约束IX_UniqueStudentCode,插入了重复的空值(NULL)到Students表。
所以SQL Server的唯一键和唯一索引会将空值(NULL)也算作重复值,我们可以将上面的唯一键IX_UniqueStudentCode删掉,将其建立为唯一索引:
ALTER TABLE [dbo].[Students] DROP CONSTRAINT [IX_UniqueStudentCode] CREATE UNIQUE NONCLUSTERED INDEX [IX_UniqueStudentCode] ON [dbo].[Students] ( [StudentCode] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] GO
会得到相同的实验结果。
分类:
Sql Server
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
2018-07-12 asp.net mvc Post上传文件大小限制 (转载)