【发布时间】: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