MySQL - 在单个查询中更新列的序列

时间:2012-04-04 08:09:50

标签: mysql

我正在使用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)

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_1queue_2的更新查询。

queue_1制作一个更新查询,为queue_2制作另一个查询, 因为MySQL在更新值时会感到困惑,并在queue_2之前更新queue_1,这会使您的结果0

答案 2 :(得分:0)

值得注意的是,如果您依赖于依赖于服务器的行为,例如This behavior differs from standard SQL隐含的行为,您将来需要小心。如果更改数据库怎么办?或者其他人在没有意识到订购重要性的情况下更新该代码?

您可能最好将更新拆分为两个明确的语句,并使用事务来确保它们以原子方式运行。