Sql 忽略特定重复值的唯一密钥设置

Sql 忽略特定重复值的唯一密钥设置,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个运行的MVC代码,它需要一个设置,其中没有两个相同的Employeeid可以保持活动状态 需求说明>>重复的EmployeeID不能同时保持活动状态,但如果删除EmployeeID,则多个已删除的条目可以保留在那里。i、 e 员工ID已删除 1 | 1 > ok 1 | 0 > ok 1 | 0 > Not Allowed. 1

我有一个运行的MVC代码,它需要一个设置,其中没有两个相同的Employeeid可以保持活动状态

需求说明>>重复的EmployeeID不能同时保持活动状态,但如果删除EmployeeID,则多个已删除的条目可以保留在那里。i、 e

员工ID已删除

1         |      1         >   ok
1         |      0         >   ok
1         |      0         >   Not Allowed.
1         |      1         >   It should be allowed but here the constraint throws error.
请注意,在应用程序场景中,我没有运行带有'isdeleted'=1标志的插入,但我只是删除活动记录并将'isdeleted'的值从0更新为1

采取的步骤>>我尝试在数据库中对(EmployeeID,IsDeleted)的组合进行唯一约束,但如上所述,当我尝试将“IsDeleted”标志从0更新为1时,它会引发错误(原因-已经有一个条目具有相同的EmployeeID,IsDeleted为1)

完成>>“IsDeleted”的结果应从0成功更新为1

由于唯一约束,现在收到的结果>>更新失败


请帮忙

如果我理解正确,您需要一个经过筛选的唯一索引:

create unique index unq_t_employeeId_isdeleted_0 on t(employeeId)
   where isDeleted = 0;

是一个dbfiddle。

您的唯一约束将不起作用,因为唯一允许的值是(EmployeeId,0)和(EmployeeId,1),没有重复项

要解决您的问题,您可以创建一个
函数
,并将其与
检查一起使用

CREATE  FUNCTION CountActive(
    @EmployeeId INT
)
RETURNS TINYINT
AS
BEGIN
    RETURN  (
        SELECT  COUNT(1)
        FROM    [dbo].[Employee]
        WHERE [EmployeeId] = @EmployeeId
            AND [IsDeleted] = 0
    );
END;
并且,在您的表格上添加一个
检查
约束:

CHECK([CountActive]([EmployeeId]) <= 1)

检查([CountActive]([EmployeeId]),但当我插入一个具有重复EmployeeId且isdeleted=0的记录时(当已经存在一个具有相同EmployeeId且isdeleted=0的记录时),不会引发异常@isha…这需要是一个唯一的索引。我在文本中说明了它,但在代码中省略了关键字。为什么EmployeeID=1有多个条目?@marcos,因为你可以删除一个员工,然后用相同的员工ID再次创建。