postgresql 表数据移动
Posted
技术标签:
【中文标题】postgresql 表数据移动【英文标题】:postgresql table data movement 【发布时间】:2017-06-12 07:07:47 【问题描述】:在 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 选项卡中设置它以删除确切的数据并在别名表中移动。
【问题讨论】:
不相关,但您可以通过使用可写 CTE 避免两次列出相同的条件:with deleted as (delete from a where ...) insert into b select * from deleted;
【参考方案1】:
虽然 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 触发......
【讨论】:
我想在每个月的 5 个日期在 crontab 中解决这个问题,所以它的查询正确吗? 什么是 1 个月,即 30 天或 31 天 r 需要 6 月 5 日到 7 月 5 日 是的。试试select now() - '4 month'::interval
- 它给你 2 月 12 日,尽管我们在 2 月有 28 天
我还有一个疑问
有什么疑问?【参考方案2】:
在每个月的第一天运行它并这样写:
... WHERE date >= date_trunc('month', current_timestamp) - INTERVAL '1 month'
AND date < date_trunc('month', current_timestamp)
如果您的表包含大量数据,您可能需要研究分区。
【讨论】:
以上是关于postgresql 表数据移动的主要内容,如果未能解决你的问题,请参考以下文章