首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL唯一约束允许与空值冲突。

SQL唯一约束允许与空值冲突。
EN

Stack Overflow用户
提问于 2019-08-31 10:56:08
回答 2查看 1.1K关注 0票数 2

我有一个表,它在3列"MenuId“、"Name”和"ParentId“上有一个非聚集的唯一索引。

问题是,当ParentId设置为NULL时,我能够在这个表中插入多个违反唯一约束的行,如下所示。

如果我试图添加重复行,而ParentId不是null,那么唯一约束就会像预期的那样工作。

我对唯一索引的理解是,它只允许一个参与索引的列的唯一组合,所以在下面的图像中,我希望能够安装第一行,但是当插入第二个(和第三个)行时,它应该会抛出一个违反索引的异常--但它没有。

我哪里出问题了?

我使用的是SQL LocalDb。

更新:我使用ignore从代码中生成数据库,在这种情况下,当ParentId或Name为NULL时,使用WHERE子句创建唯一约束:

代码语言:javascript
复制
CREATE UNIQUE NONCLUSTERED INDEX [IX_MenuItem_MenuId_ParentId_Name]
    ON [dbo].[MenuItem]([MenuId] ASC, [ParentId] ASC, [Name] ASC) 
WHERE ([ParentId] IS NOT NULL AND [Name] IS NOT NULL);

Embaressingly,在我探索Server属性窗口中的唯一约束时,这个WHERE子句不明显--我只是检查了唯一约束的存在,以及我希望包含的列--但是这还不够。感谢下面的注释,他无法复制,并让我查看脚本中的索引,这里的子句出现了。我现在将我的问题转移到一个有关EF为什么在我的例子中产生这种情况的问题上:https://github.com/aspnet/EntityFrameworkCore/issues/17586

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-03 09:59:28

感谢@蕭為元提醒我更详细地查看唯一的约束,而不仅仅是在属性窗口中!

唯一索引有一个WHERE子句,导致它忽略具有父ID或名称的空值的记录:

代码语言:javascript
复制
CREATE UNIQUE NONCLUSTERED INDEX [IX_MenuItem_MenuId_ParentId_Name]
    ON [dbo].[MenuItem]([MenuId] ASC, [ParentId] ASC, [Name] ASC) 
WHERE ([ParentId] IS NOT NULL AND [Name] IS NOT NULL);

这是由EF产生的--当你依赖ORM为你做事情,并假设他们做你想做的事情时,你就会碰到这样的问题--拍拍自己的手腕

票数 2
EN

Stack Overflow用户

发布于 2019-08-31 12:02:53

将-1设置为ParentId的默认值。

代码语言:javascript
复制
ALTER TABLE TableName 
ADD CONSTRAINT cUniq UNIQUE (MenuId,Name,ParentId);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57737392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档