You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL执行UPDATE脚本时如何将变更前后数据存入TEMP临时表

实现思路

核心用到PostgreSQL的UPDATE语句支持的RETURNING子句,可以在执行更新的同时返回变更前后的字段值,直接插入到你的临时表中即可。

方案1:对应原有5条UPDATE的改造方案

先创建你需要的临时表:

CREATE TEMP TABLE temp_change(
    Table_where_changed TEXT,
    Column_where_changed TEXT,
    Value_before_update TEXT,
    Value_after_upadate TEXT
);

然后把每一条UPDATE语句都加上RETURNING插入逻辑,示例如下,其余4条按照相同逻辑修改即可:

UPDATE public.table1 
SET column1 = replace(column1,'ú','u')
WHERE column1 LIKE '%ú%'
RETURNING 
    'public.table1',
    'column1',
    OLD.column1,
    NEW.column1
INTO temp_change;
方案2:更高效的合并更新方案

不需要执行5次UPDATE,直接用PostgreSQL内置的translate函数一次性完成所有特殊字符替换,性能更高,尤其适合数据量大的场景:

-- 先建临时表(如果还没建)
CREATE TEMP TABLE IF NOT EXISTS temp_change(
    Table_where_changed TEXT,
    Column_where_changed TEXT,
    Value_before_update TEXT,
    Value_after_upadate TEXT
);

-- 一次性完成所有替换+变更日志插入
UPDATE public.table1
SET column1 = translate(column1, 'úûüýÿ', 'uuuyy')
WHERE column1 ~ '[úûüýÿ]' -- 过滤出包含任意待替换字符的行
RETURNING
    'public.table1'::TEXT,
    'column1'::TEXT,
    OLD.column1,
    NEW.column1
INTO temp_change;
注意事项
  • 临时表为会话级,PgAdmin会话断开后会自动删除,确认变更无误后记得提前导出temp_change的数据或者持久化到普通表
  • 操作生产数据前建议先开启事务测试:执行BEGIN;运行更新语句后,先查询temp_change确认变更符合预期再执行COMMIT;,如有问题直接执行ROLLBACK;回滚即可
  • 你提供的临时表定义中Value_after_upadate为拼写错误,如需修改为正确的Value_after_update,请同步调整RETURNING子句中的字段对应关系

内容的提问来源于stack exchange,提问作者Artur Dino

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 18:15:00