0

我正在尝试扫描一个表,从它的两个列中查询输入,并使用这些输入来更新同一个表的另一列。

我现在正在做的方式是:扫描表格提取值:

SELECT key, col1,col2 from table1;

然后我为每一行做一个昂贵的操作:

someComputedValue = someComplicatedFunction(col1,col2)

然后使用另一个更新查询对其进行更新

Update mytable where primaryKey = key set col3 = someComputedValue

由于我正在处理的表很大,我想知道是否有某种方法可以在扫描时更新值。基本上每次更新调用只进行一次查询。

编辑:我想我没有说清楚。我正在从 java 连接到数据库,complexFunction 不能作为 sql 函数实现(它很复杂)。它将改为在 java 中计算。我认为不可能在 sql 语句中提供 java 函数(是吗?)。这就是为什么我目前必须从数据库中读取值,然后用另一个语句更新它。

所以理想情况下,我想做这样的事情。

  1. 指向 sql 表中的一行。

  2. 将值读取到 java 变量中(同时仍指向同一行)

  3. 更新该行中的另一列

4

2 回答 2

2

是的:

UPDATE mytable SET col3=someComplicatedFunction(col1,col2);

它很可能会锁定桌子,直到它完成。为了解决这个问题,你可以说一次 10 个,或者通过 WHERE 子句通过数据库外部的某些东西来限制。

另一种解决方案是创建另一个表(列定义省略,因为您没有指定):

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;

这将分两步完成,理论上允许 temp 花费尽可能长的时间来创建,同时只在 mytable 上放置一个读锁(而不是你会有的写锁)。实际写入 mytable 会非常快。棘手的部分是您仍然不能允许 mytable 在此过程中更改,因为更改可能不会反映在 temp.xml 中。

编辑:(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,然后在循环输入 ( SELECTEDas (key, col1, col2)) 时,计算col3并添加行,说"WHEN "+keyval+" THEN "+col3val. key还要在:的值之后保留一个字符串keystr+=", "+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 回答