我有一个表,它在3列"MenuId“、"Name”和"ParentId“上有一个非聚集的唯一索引。
问题是,当ParentId设置为NULL时,我能够在这个表中插入多个违反唯一约束的行,如下所示。
如果我试图添加重复行,而ParentId不是null,那么唯一约束就会像预期的那样工作。
我对唯一索引的理解是,它只允许一个参与索引的列的唯一组合,所以在下面的图像中,我希望能够安装第一行,但是当插入第二个(和第三个)行时,它应该会抛出一个违反索引的异常--但它没有。
我哪里出问题了?
我使用的是SQL LocalDb。

更新:我使用ignore从代码中生成数据库,在这种情况下,当ParentId或Name为NULL时,使用WHERE子句创建唯一约束:
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
发布于 2019-09-03 09:59:28
感谢@蕭為元提醒我更详细地查看唯一的约束,而不仅仅是在属性窗口中!
唯一索引有一个WHERE子句,导致它忽略具有父ID或名称的空值的记录:
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为你做事情,并假设他们做你想做的事情时,你就会碰到这样的问题--拍拍自己的手腕
发布于 2019-08-31 12:02:53
将-1设置为ParentId的默认值。
或
ALTER TABLE TableName
ADD CONSTRAINT cUniq UNIQUE (MenuId,Name,ParentId);https://stackoverflow.com/questions/57737392
复制相似问题