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

MySQL更新更改多个列是非原子的吗?,第1张

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支持)。



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5662337.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存