はい:
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 を変更できないことです。
編集:( someComplicatedFunction
Javaで実装する必要があります):
最も単純な形式では、はい: を接続し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 "+col3val
key
keystr+=", "+keyval;
WHERE key IN ("+keystr+");"
したがって、単一のクエリを実行SELECT
して必要なすべての行を取得した後、Java で単一のUPDATE
クエリを計算して構築することができます。