1

我正在使用 MySQL InnoDB。

我想更新一个表并控制每列更新的顺序。如果可能的话,多合一查询。原因是我有一个游戏队列系统。当你完成 queue_1 我希望它被分配 queue_2 的值,然后擦除 queue_2。

现在我得到了不可预测的结果。有时total_price_2 设置为零,然后加载到total_price_1。两者都归零。(不是我想要的。)

我读到数据库决定运行更新的顺序。如果我必须进行两次更新,那很好。我的目标是表现。

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)
4

3 回答 3

2

根据MichaelRushton的建议,检查更新之前的total_price_2情况。0

在 MySQL 中,单表UPDATE查询是从“从左到右”处理的,在UPDATE语句文档中有说明:

单表 UPDATE 分配通常从左到右进行评估。对于多表更新,不能保证以任何特定顺序执行分配。(来源

具体来说,请注意以下示例:

以下语句中的第二个赋值将 col2 设置为当前(更新的)col1 值,而不是原始 col1 值。结果是 col1 和 col2 具有相同的值。此行为不同于标准 SQL。

UPDATE t1 SET col1 = col1 + 1, col2 = col1;


边注

附带说明一下,您还可以使用子句显式指定要更新的行的顺序:ORDER BY

如果没有 WHERE 子句,所有行都会更新。如果指定了 ORDER BY 子句,则按指定的顺序更新行。(来源

于 2012-04-04T08:29:32.020 回答
0

将更新查询拆分为queue_1queue_2

queue_1对和 进行一个更新查询queue_2,因为 MySQL 在更新值时会感到困惑,并且它会在更新queue_2之前更新queue_1,这会产生结果0

于 2012-04-04T08:20:59.003 回答
0

值得注意的是,如果您依赖于服务器相关的行为,例如 所暗示的This behavior differs from standard SQL,您以后需要小心。如果你改变数据库怎么办?或者其他人在没有意识到排序的重要性的情况下更新了代码?

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

于 2012-04-04T09:53:31.543 回答