首页 > 解决方案 > SQL Server 使用公用表表达式避免唯一约束冲突

问题描述

如果我对列部门有唯一约束,并且我不希望 SQL 引发唯一约束冲突,那么如果值已存在于不同的行上,我不想更新该列。如果我有两个或多个用户/连接同时执行相同的代码,这是否可以安全使用(一致性)?谢谢!

declare @piDepartment varchar(20) = 'test'
declare @piDepartmentSid int = 1105;

WITH CTE
as
(
    select top 1 1 [exists]
    from 
        dbo.tb_Department
    where
        Department = @piDepartment and
        [Department_SID] <> @piDepartmentSid
)
update D set 
    Department = @piDepartment
FROM 
    dbo.tb_Department D
    left join CTE on 1 = CTE.[exists]
where
    D.Department_SID = @piDepartmentSid and
    CTE.[exists] is null;

标签: sql-serverconcurrency

解决方案


一种更安全的方法是保留唯一约束并使用 TRY..CATCH 块来避免在发生约束冲突时引发错误。


推荐阅读