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
相关产品推荐
相关产品推荐

