1

MySQL InnoDB を使用しています。

テーブルを更新し、各列が更新される順序を制御したいと思います。可能であれば、すべて 1 つのクエリで。その理由は、ゲームのキュー システムがあるからです。queue_1 が終了したら、queue_2 の値を割り当ててから、queue_2 を消去します。

今、私はこれから予測できない結果を得ています。場合によっては、total_price_2 がゼロに設定され、total_price_1 にロードされます。どちらもゼロになります。(私が欲しいものではありません。)

DBが更新を実行する順序を決定することを読みました。更新を 2 回行う必要がある場合は、問題ありません。私の目標はパフォーマンスです。

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 割り当ては、通常、左から右に評価されます。複数テーブルの更新の場合、割り当てが特定の順序で実行されるという保証はありません。(ソース

具体的には、次の例に注意してください。

次のステートメントの 2 番目の代入は、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_1との更新クエリを分割しますqueue_2

MySQL は値を更新するときに混乱し、 の前に更新され、結果が になるため、に対して 1 つの更新クエリを作成しqueue_1、別の更新クエリを作成します。queue_2queue_2queue_10

于 2012-04-04T08:20:59.003 に答える
0

によって暗示されるなど、サーバーに依存する動作に依存している場合This behavior differs from standard SQLは、今後注意する必要があることに注意してください。DB変えたら?それとも、他の誰かが順序の重要性を認識せずにそのコードを更新していますか?

更新を 2 つの明確なステートメントに分割し、トランザクションを使用してそれらがアトミックに実行されるようにする方がよい場合があります。

于 2012-04-04T09:53:31.543 に答える