曲演杂坛--Update的小测试


今天偶然想起一个UPDATE相关的小问题,正常情况下,如果我们将UPDATE改写成与之对应的SELECT语句,其SELECT查询结果应与UPDATE的目标表存在一对一的关系,例如:

对于UPDATE语句:

UPDATE TB1 
SET C2=TB2.C2 
FROM TB1 
INNER JOIN TB2 
ON TB1.C1=TB2.C1

假设TB1中C1为主键,那么改写成对应的SELECT SQL

SELECT TB1.C1,
TB1.C2 AS C2_OLD,
TB2.C2 AS C2_NEW
FROM TB1 
INNER JOIN TB2 
ON TB1.C1=TB2.C1

以上查询结果应该也可以以C1为主键,即C1在此查询结果中是唯一的。

问题出现了,如果查询结果中C1不唯一,那么更新后的结果会是什么呢?

让我们来测试下,准备测试数据:

复制代码
CREATE TABLE TB001
(
    C1 INT,
    C2 INT
);
GO
CREATE TABLE TB002
(
    C1 INT,
    C2 INT
);

DELETE FROM TB001
DELETE FROM TB002


INSERT INTO TB001(C1,C2)
SELECT 1,1
UNION ALL
SELECT 2,1

GO
INSERT INTO TB002(C1,C2)
SELECT 1,3
UNION ALL
SELECT 1,2
UNION ALL
SELECT 2,4


GO
SELECT * FROM TB001
SELECT * FROM TB002
GO
SELECT *
FROM TB001 T1 
INNER JOIN TB002 T2
ON T1.C1=T2.C1
复制代码

查询结果中C1的记录并不唯一,如果我们对此更新,结果会是什么呢?

UPDATE方式1

复制代码
--第一种更新
UPDATE TB001
SET C2=T1.C2*T2.C2
FROM TB001 T1 
INNER JOIN TB002 T2
ON T1.C1=T2.C1

--查看执行结果
SELECT * FROM TB001
复制代码

UPDATE方式2

--第二种更新
UPDATE TB001
SET C2=TB001.C1*T2.C2
FROM TB002 T2
WHERE TB001.C1=T2.C1
--查看执行结果
SELECT * FROM TB001

UPDATE方式3

复制代码
--第三种更新
WITH TMP AS
(
    SELECT T1.C1,T1.C2,T1.C2*T2.C2 AS NewC2
    FROM TB001 T1 
    INNER JOIN TB002 T2
    ON T1.C1=T2.C1
)
UPDATE TMP
SET C2=NewC2
--查看执行结果
SELECT * FROM TB001
复制代码

通过比较,不难看出,对于第一种和第三种方式,TB001中的C1=1的记录只被更新1次,而对于第二种方式来说,该记录被更新2次。

 

---====================================================================

对于上面的例子,无论那种方式,更新结果都可能不是我们预期的结果,因此我们避免此类操作(尤其是生产环境)。

尽管这些测试没有太多意义,但聊胜于无,供各位看官一看。

BTW:对于三种UPDATE写法,个人偏好第三种,因为可以很容易滴查看SELECT结果集,从而对更新后的结果有一个预期了解,以检查是否满足需求。

--====================================================================

很多人是来看妹子的,我懂你们的。。。

重口难调,你们将就下

 

posted on   笑东风  阅读(481)  评论(7编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现

导航

点击右上角即可分享
微信分享提示