2012-09-17 54 views
0

我試圖掃描一個表,從兩列中查詢輸入,並使用這些輸入來更新同一個表的另一列。掃描mysql表並更新列

我現在正在做的方式是: 掃描通過表中提取值:

SELECT key, col1,col2 from table1; 

然後我做的每一行昂貴的操作:

someComputedValue = someComplicatedFunction(col1,col2) 

,然後更新它使用另一更新查詢

Update mytable where primaryKey = key set col3 = someComputedValue 

由於表I我正在處理的是很大,我想知道是否有某種方式只是在掃描時更新值。基本上只是每更新一次查詢一個查詢。

編輯:我想我沒有說清楚。我正在從java連接到數據庫,複雜函數不能作爲sql函數實現(它很複雜)。它將在java中計算。我不認爲可以在sql語句中提供一個java函數(是嗎?)。這就是爲什麼我現在必須從數據庫中讀取值,然後用另一個語句更新它。

所以理想情況下,我想要做這樣的事情。

  1. 朝着SQL表中的一行點。

  2. 讀值進入Java變量(同時仍指向同一行)

  3. 更新另一列此行中

回答

0
UPDATE myTable SET col3 = myFunction(col1, col2) WHERE primaryKey = key 

應該瞭解你那裏。

2

是:

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查詢。

+0

編輯了這個問題。 –