我正在使用MySQL InnoDB。
我想更新一个表并控制每列更新的顺序。如果可能的话,在一个查询中。原因是我有一个游戏队列系统。完成queue_1后,我希望为其分配queue_2的值,然后擦除queue_2。
现在我得到了不可预知的结果。有时total_price_2设置为零,然后加载到total_price_1中。两者都变为零。 (不是我想要的。)
我读到DB决定运行更新的顺序。如果我必须进行两次更新,那很好。我的目标是表现。
UPDATE
queue
SET
queue_1 = queue_2,
total_price_1 = total_price_2,
total_wait_1 = total_wait_2,
queue_2 = '',
total_price_2 = 0,
total_wait_2 = 0
WHERE id IN(1,2,3)
答案 0 :(得分:2)
根据MichaelRushton的建议,检查更新前total_price_2
是否0
。
在MySQL中,单表UPDATE
查询是从“从左到右”处理的,这在UPDATE
语句文档中有说明:
单表UPDATE分配通常从左到右进行评估。对于多表更新,无法保证以任何特定顺序执行分配。 (Source)
具体来说,请注意这个例子:
以下语句中的第二个赋值将col2设置为当前(更新的)col1值,而不是原始col1值。结果是col1和col2具有相同的值。此行为与标准SQL不同。
UPDATE t1 SET col1 = col1 + 1, col2 = col1;
旁注
作为旁注,您还可以使用ORDER BY
子句明确指定要更新行的顺序:
如果没有WHERE子句,则更新所有行。如果指定了ORDER BY子句,则按指定的顺序更新行。 (Source)
答案 1 :(得分:0)
拆分queue_1
和queue_2
的更新查询。
为queue_1
制作一个更新查询,为queue_2
制作另一个查询,
因为MySQL在更新值时会感到困惑,并在queue_2
之前更新queue_1
,这会使您的结果0
。
答案 2 :(得分:0)
值得注意的是,如果您依赖于依赖于服务器的行为,例如This behavior differs from standard SQL
隐含的行为,您将来需要小心。如果更改数据库怎么办?或者其他人在没有意识到订购重要性的情况下更新该代码?
您可能最好将更新拆分为两个明确的语句,并使用事务来确保它们以原子方式运行。