はい:
UPDATE mytable SET col3=someComplicatedFunction(col1,col2);
ただし、完了するまでテーブルがロックされる可能性があります。これを回避するには、DB の外部の何かによって抑制された WHERE 句を介して、一度に 10 個または何かを指定できます。
別の解決策は、別のテーブルを作成することです(指定しなかったため、列定義は省略されています):
START TRANSACTION;
CREATE TABLE temp (key, col3) SELECT key, someComplicatedFunction(col1,col2) FROM mytable;
UPDATE mytable mt, temp tp SET mt.col3=tp.col3 WHERE mt.key=tp.key;
DROP TABLE temp;
COMMIT;
これは 2 つのステップで実行されます。理論的には、mytable に読み取りロックを設定するだけで (そうでない場合の書き込みロックとは対照的に)、作成に必要なだけ temp を許可します。mytable への実際の書き込みは非常に高速です。注意が必要なのは、変更が temp に反映されない可能性があるため、プロセス中に mytable を変更できないことです。
編集:( someComplicatedFunctionJavaで実装する必要があります):
最も単純な形式では、はい: を接続しSELECT、 と foreach の結果をUPDATE.
それは遅くなります。残念ながら、SQL がコールバックなどをサポートしているとは思えません。データを取得するにはクエリを使用し、データを返すにはクエリを使用する必要があります。SELECTただし、1 つだけ実行してそれを反復するだけで、既に速度を上げることができます。(col1, col2)が一意であるかどうかによっては、を選択し、それに基づいて更新することで高速になる場合もあります。(col1, col2)
ただし、最善の策は次のCASE構文を使用することです。
UPDATE mytable
SET myfield = CASE other_field
WHEN 1 THEN 'value'
WHEN 2 THEN 'value'
WHEN 3 THEN 'value'
END
WHERE id IN (1,2,3)
したがって、 を含む文字列から始めて、入力 ( as )UPDATE mytable SET col3 = CASE keyをループしながら を計算し、 という行を追加します。また、 :の値に続く文字列を保持します。それらをすべて確認したら、次の行を追加するだけです。SELECTED(key, col1, col2)col3"WHEN "+keyval+" THEN "+col3valkeykeystr+=", "+keyval;WHERE key IN ("+keystr+");"
したがって、単一のクエリを実行SELECTして必要なすべての行を取得した後、Java で単一のUPDATEクエリを計算して構築することができます。