栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

MySQL更新更改多个列是非原子的吗?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

MySQL更新更改多个列是非原子的吗?

如MySQL手册所述:

以下语句中的第二个赋值设置

col2
为当前(更新)
col1
值,而不是原始
col1
值。结果是
col1
col2
具有相同的值。此行为不同于标准SQL。

更新t1 SET col1 = col1 + 1,col2 = col1;

因此,在您的情况下,用于

a21
评估表达式的值
`a11
= (2 *
storage
.
a11
) + (-1 *
storage
.
a21
)`是新的,更新的值4,而不是原始值5。正如手册所述, 此行为不同于标准SQL

您可以改为使用带有多表

UPDATE
语法的自联接,但是我不知道是否可以使用Django ORM来实现类似的功能:

UPDATE storage AS old  JOIN storage AS new USING (id)SET  new.a21   = (3 * old.a11) + (-1 * old.a21),  new.a22   = (3 * old.a12) + (-1 * old.a22),  new.level = old.level - -1,  new.a11   = (2 * old.a11) + (-1 * old.a21),  new.a12   = (2 * old.a12) + (-1 * old.a22);

在sqlfiddle上看到它。

我唯一的另一种想法(肯定应该在Django中可以实现)是将更新拆分为单独的部分,相对于早先已更新的那些字段的新值(而不是旧值),定义了在后来的部分中更新的字段部分:

UPDATE storageSET    a21   = (3 * a11) + (-1 * a21),       a22   = (3 * a12) + (-1 * a22),       level = level - -1;UPDATE storageSET    a11   = (2 * a11) + (-1 * (3*a11 - a21)),       a12   = (2 * a12) + (-1 * (3*a12 - a22));

为了防止并发问题,您应该在事务中执行这两个更新(如果RDBMS支持)。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/660270.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号