如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支持)。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)