postgresql表数据移动

时间:2017-06-12 07:07:47

标签: postgresql postgresql-9.4

在PostgreSQL中,我想创建一个脚本,它可以从A表(包含很多行)中删除1个月之前的旧数据,并将此数据插入到一个新的别名表中。我想每月执行这个脚本。

因为我创建了脚本

insert into B select * from A where date >(now-'30 day'::interval);
delete from A where date <(now()-'30 days.

但是在某个月有30天,在31天左右。所以如何在cron选项卡中设置它以删除确切的数据并移入别名表。

2 个答案:

答案 0 :(得分:0)

每个月的第一天运行它并按如下方式编写:

... WHERE date >= date_trunc('month', current_timestamp) - INTERVAL '1 month'
      AND date <  date_trunc('month', current_timestamp)

如果您的表包含大量数据,您可能需要查看分区。

答案 1 :(得分:0)

虽然Laurenz的回答很有意义,似乎很好地猜测了OP真正想要的东西(cron月度可能意味着他想要冲洗“不是一个月”,而是“上个月”所以date_trunc到月是一个案例)

然而另一种方式回答它(​​据我理解原帖):

begin;
    insert into B select * from A where date >(now()-'1 month'::interval);
    delete from A where date <(now()-'1 month'::interval);
end;

将删除上个月的所有数据,但不会删除一个月前的相同时间戳,例如:

t=# select now()-'1 month'::interval;
           ?column?
-------------------------------
 2017-05-12 07:31:31.785402+00
(1 row)

根据这个逻辑,您可能希望每天安排此数据清除,而不是每月安排 - 将上个月的数据保留在活动表中,而不是“最多两个”直到cron fires ......