2017-01-30 7 views
1

場合によっては、ある列から別の列に値をコピーし、最初にNULLを設定する必要があります。このSQLステートメントは、期待通りに機能します。値をある列から別の列にコピーし、NULLに設定する - MySQL

UPDATE lessons SET order_id_old = order_id, order_id = NULL WHERE id = 1 

しかし、これが正しい方法であるかどうかはわかりません。あるいは、私はこの目的のために2つのクエリを使うべきでしょうか? documentationから

UPDATE lessons SET order_id_old = order_id WHERE id = 1; 
UPDATE lessons SET order_id = NULL WHERE id = 1; 
+1

これは正しい方法です。あなたがわからない場合は、それを一時テーブルに複製して最初にテストしてください。 – Ibu

+1

2つのステートメントを使用する場合は、トランザクションを使用してアトミック性を確保する必要があります。 – Barmar

答えて

2

私は間違いなく第2のアプローチに行きます。ここだdocumentationは言う:

単一テーブルUPDATE割り当ては、一般的に 左から右に評価されます。複数テーブルの更新の場合、特定の順序で 割り当てが実行されるという保証はありません。

あなたの場合は、テーブルが1つしかないので、現時点では問題ありません。しかし、将来、誰かがこの文を修正し、新しいtable/joinを追加した場合(それは1つの数字がtableのように正常に動作すると仮定します)、動作が停止し、矛盾した結果が得られます。

したがって、可読性/保守性の目的で、2番目のアプローチに進みます。 (また、ステートメントをを保存するためにtransactionにラップすることをお勧めします)

1

あなたが式の中で更新されるテーブルの列にアクセスする場合は、UPDATEは列の現在の値を使用しています。たとえば、次の文は、現在の値よりcol1一方に複数のセット:

UPDATE t1 SET col1 = col1 + 1; 

次の文の2番目の割り当ては、(更新)現在col1値ではなく、元のcol1値にcol2を設定します。その結果、col1col2の値は同じになります。この動作は標準SQLとは異なります。

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

単一テーブルUPDATEの割り当ては、通常、左から右に評価されます。複数テーブルの更新の場合、特定の順序で割り当てが行われるという保証はありません。

あなたの場合は、1つのステートメントを使用すると問題はありません。

関連する問題