是:
UPDATE mytable SET col3=someComplicatedFunction(col1,col2);
它,直到它完成雖然很好可能會鎖定該表。爲了解決這個問題,你可以一次說10個,或者通過一個WHERE子句來控制數據庫外部的東西。
另一種解決方案是創建另一個表(列DEFS省略,因爲你沒有指定):
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;
這將做到這兩個步驟,在理論上允許溫度到只要有必要建立取,而只是在mytable上放置一個讀鎖(而不是寫鎖)。實際寫入mytable的速度將非常快。棘手的部分是你仍然不能允許mytable在這個過程中改變,因爲改變可能不會反映在temp中。
編輯:(該someComplicatedFunction
必須用Java來實現):
在最簡單的形式,是:你只需要連接,SELECT
和foreach結果,UPDATE
。
這會很慢。可悲的是,我不相信SQL支持回調或其他任何東西 - 您將需要使用查詢來獲取數據和查詢以返回數據。但是,只需執行一個SELECT
並重復此操作,就可以加快速度。根據(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)
於是,開始用含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
查詢。
編輯了這個問題。 –