sql-server - 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;
解决方案
一种更安全的方法是保留唯一约束并使用 TRY..CATCH 块来避免在发生约束冲突时引发错误。
推荐阅读
- python - 应用程序(Python Django,PostgreSql)已成功部署在 Heroku 上,但尝试打开时出现错误
- python - pyspark 上的这个功能有什么问题?
- google-chrome-devtools - puppeteer page.waitForSelector 执行时会发生什么
- c# - 在锁定的 Windows 10 机器上的后台进程中将文本放入剪贴板
- node.js - 在 NodeJS 中加密/解密 JSON 数据
- javascript - 序列化表单数据返回未定义
- java - 在Java中向子进程发送信号
- javascript - 期待 WebStorm 上出现换行符或分号错误
- xml - 我想读取一个 xml 文件,但它在 < 之前包含一个“-”
- spring - 使用 togglz 实现基于环境(dev、qa、prod)的特性标志