是的:
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
,然后在循环输入 ( SELECTED
as (key, col1, col2)
) 时,计算col3
并添加行,说"WHEN "+keyval+" THEN "+col3val
. key
还要在:的值之后保留一个字符串keystr+=", "+keyval;
。一旦你完成了所有这些,你只需要添加行WHERE key IN ("+keystr+");"
。
因此,您可以单次SELECT
获取所有需要的行,然后由 Java 计算和构建单次UPDATE
查询。