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 触发...
在 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 触发...