0

テーブルをスキャンし、その 2 つの列から入力をクエリし、それらの入力を使用して同じテーブルの別の列を更新しようとしています。

私が今やっている方法は、値を抽出するテーブルをスキャンすることです:

SELECT key, col1,col2 from table1;

次に、各行に対して高価な操作を行います。

someComputedValue = someComplicatedFunction(col1,col2)

そして、別の更新クエリを使用して更新します

Update mytable where primaryKey = key set col3 = someComputedValue

私が扱っているテーブルは大きいので、スキャン中に値を更新する方法があるかどうか疑問に思っていました。基本的に、更新呼び出しごとに 1 つのクエリを作成するだけです。

編集:私は自分自身を明確にしていないと思います。java からデータベースに接続していますが、複雑な関数は SQL 関数として実装できません (複雑です)。代わりに Java で計算されます。SQL文でJava関数を提供することは可能だとは思いません(そうですか?)。これが、現在、データベースから値を読み取ってから、別のステートメントで更新する必要がある理由です。

理想的には、このようなことをしたいと思います。

  1. SQL テーブルの行を指します。

  2. 値を Java 変数に読み込みます (同じ行を指している間)

  3. この行の他の列を更新します

4

2 に答える 2

2

はい:

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クエリを計算して構築することができます。

于 2012-09-17T17:11:21.390 に答える
0
UPDATE myTable SET col3 = myFunction(col1, col2) WHERE primaryKey = key

そこに着くべきです。

于 2012-09-17T17:04:07.700 に答える