PL/pgSQL while循环中更新单行表 如何保存SELECT结果到已有表
PostgreSQL将计算结果更新到已有表指定记录的方案
你需要的是UPDATE更新语句而非新增插入语句,原代码中不必要的GROUP BY还存在字段拼写错误,以下是可直接运行的实现:
最简实现(直接更新,无需单独SELECT)
create table data(a1 float, a2 float); -- 初始化首条记录 insert into data values(1::float, 1::float); do $$ declare counter integer := 0; begin while counter < 50 loop -- 直接基于当前字段值计算后更新 UPDATE data SET a1 = a1 - 0.1 * random(), a2 = a2 - 0.1 * random(); counter := counter + 1; end loop; end$$;
需单独SELECT计算的场景(逻辑更复杂时使用)
如果你的计算逻辑必须先通过SELECT处理,可以用变量暂存计算结果再更新:
create table data(a1 float, a2 float); insert into data values(1::float, 1::float); do $$ declare counter integer := 0; new_a1 float; new_a2 float; begin while counter < 50 loop -- 查询计算得到新值存入变量 SELECT a1 - 0.1 * random(), a2 - 0.1 * random() INTO new_a1, new_a2 FROM data LIMIT 1; -- 只取首条记录计算 -- 变量值写入表 UPDATE data SET a1 = new_a1, a2 = new_a2; counter := counter + 1; end loop; end$$;
注意事项
- 如果
data表存在多条记录,需要明确指定更新的行:- 如有主键ID字段:加
WHERE id = 1定位首条业务记录 - 无主键可使用PostgreSQL内置物理行号:加
WHERE ctid = (SELECT min(ctid) FROM data)定位存储层面的首条记录
- 如有主键ID字段:加
- 原代码中的
GROUP BY a1, a存在拼写错误,a字段不存在,当前流水累计场景不需要分组逻辑
内容的提问来源于stack exchange,提问作者Clebo Sevic
相关产品推荐
相关产品推荐

