postgresql table 数据移动

postgresql table data movement

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

为此我创建了脚本

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

但有些月份有 30 天,有些月份有 31 天。那么我如何在 cron 选项卡中设置它以删除确切数据并移入别名 table。

运行每个月的第一天,这样写:

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

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

虽然 Laurenz 的回答很有意义,而且似乎很好地猜测了 OP 真正想要的东西(cron monthly 可能意味着他想要刷新的不是 "older than one month",而是 "previous month" 所以 date_trunc以月为一例)

但换一种方式回答(据我了解原文post):

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)

根据这个逻辑,您可能希望每天而不是每月安排此数据清除 - 以保持上个月的数据处于活动状态 table,而不是 "up to two" 直到 cron 触发...