首页 > 解决方案 > 使用批量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。看起来这个脚本正在事务中执行,并且只在最后提交。为什么会这样?如何让它在每次迭代中写入?

标签: sqlpostgresqltransactions

解决方案


事实证明,函数默认在它们自己的事务中工作。而在 postgres 10 中,没有办法在中间提交更改,尽管我们可以使用EXCEPTION关键字来处理错误。在 postgres 11 中有支持提交的新特性过程。


推荐阅读