sql - 使用批量postgres将数据从表复制到表?
问题描述
我有一个大表,需要将 1 亿行从它复制到另一个。我正在尝试使用此脚本按 1 小时间隔批量复制来做到这一点:
DO $$
DECLARE
intervalStrart TIMESTAMP := '2019-07-01 00:00:00'::timestamp;
intervalEnd TIMESTAMP;
stopTime TIMESTAMP :='2019-07-25 00:00:00'::timestamp;
BEGIN
WHILE (intervalStrart<=stopTime) LOOP
intervalEnd= intervalStrart + interval '1 hour';
RAISE NOTICE 'Time: %', intervalStrart;
INSERT INTO marketo.activities_copy(SELECT * from marketo.activities
WHERE activitydate>=intervalStrart and activitydate<=intervalEnd)
ON CONFLICT ON CONSTRAINT activities_copy_pkey
DO NOTHING;
intervalStrart=intervalEnd;
END LOOP;
END $$;
它打印出进度
NOTICE: Time: 2019-07-01 00:00:00
NOTICE: Time: 2019-07-01 01:00:00
NOTICE: Time: 2019-07-01 02:00:00
NOTICE: Time: 2019-07-01 03:00:00
...
但是当我检查副本表计数时,它仍然是 0。看起来这个脚本正在事务中执行,并且只在最后提交。为什么会这样?如何让它在每次迭代中写入?
解决方案
事实证明,函数默认在它们自己的事务中工作。而在 postgres 10 中,没有办法在中间提交更改,尽管我们可以使用EXCEPTION
关键字来处理错误。在 postgres 11 中有支持提交的新特性过程。
推荐阅读
- sql - 插入查询返回“未知字段名称:内容类型”错误
- javascript - 按某些字母拆分字符串,同时跳过某些字母
- java - 如何覆盖单个 feign 客户端的全局请求拦截器
- javascript - 根据前面的元素查找下一个元素
- reactjs - 我不知道如何将 Typescript 添加到我的 React useState 挂钩中,我做错了什么?
- python - 摆脱字符串开头和结尾的特定空格
- service - 如何在 Snowflake 中创建服务帐户
- amazon-web-services - 如何在 IAM 策略中的两个条件之间应用 OR 条件?
- elasticsearch - 长期保存日志 - elasticsearch
- webrtc - 当远端有噪声时,AEC3 抑制近端音频