【问题标题】:Copy data from table to table with batches postgres?使用批量postgres将数据从表复制到表?
【发布时间】:2019-12-02 06:31:46
【问题描述】:

我有一个大表,需要将 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。看起来这个脚本正在事务中执行,并且只在最后提交。为什么会这样? 如何让它在每次迭代时写入?

【问题讨论】:

  • 除非提交数据更改,否则无法从其他会话中看到该表上的更改。
  • @BarbarosÖzhan,谢谢。我如何在这里提交更改?我尝试在插入之前添加BEGIN;,在插入之后添加COMMIT;,但收到错误ERROR: syntax error at or near ";" LINE 10: BEGIN;
  • 不客气。我不知道 plpgsql 语法,但我想你可以尝试在 end loop 子句之前、intervalStrart=intervalEnd; 之后进行提交。
  • 往表中插入数据可能会出现问题,尝试单独执行相同的插入脚本,检查是否插入正确
  • @Ajay,我检查过了,它插入正确

标签: sql postgresql transactions


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-17
    • 1970-01-01
    • 1970-01-01
    • 2014-03-11
    • 2015-09-25
    • 2011-11-09
    • 1970-01-01
    相关资源
    最近更新 更多