postgresql - " cut"表数据

时间:2016-03-27 10:41:24

标签: sql postgresql merge truncate

我需要使用另一台服务器上另一个表(相同列)的数据更新服务器上的一个表。问题是我想要事后清理第一个表,就像在示例中一样。

之前:

表1 (服务器1)

 c1 | c2
---------
 a  | 10
 b  | 20

表2 (服务器2)

 c1 | c2
---------
 b  | 30
 c  | 40

后:

表1 (服务器1)

 c1 | c2
---------
 <empty>    --emptied

表2 (服务器2)

 c1 | c2
---------
 a  | 10    --inserted
 b  | 50    --updated
 c  | 40

如果表1 每隔几秒更新一次并且我不能丢失任何数据,我该如何实现?

1 个答案:

答案 0 :(得分:1)

这实际上是一个扩展的评论。

似乎table2table1的摘要。

如果您想让它们保持同步,那么您应该在update上使用insert / table1触发器。这个触发器会:

  • 如果table2不存在,请在c1中插入新行。
  • 如果table2确实存在,请更新c2中的现有行。

此过程有一个名称,&#34; upsert&#34;。在几个数据库中,它使用名为merge的语句实现。 Postgres提供了另外两种方法。

首先要做的事情是:

with u as (
      update t2
         set t2.c2 = new.c2 - coalesce(old.c2)
         where t2.c1 = new.c1
      returning *
     )
insert into t2 (c1, c2)
    select new.c1, new.c2
    where not exists (select 1 from u);

第二个是9.5中的新功能,它支持on conflict语句中的insert子句(记录为here)。

最后,对于每次更改,我都不建议从table1删除行。相反,设置一个可以不时删除它们的工作 - 每小时,每天或每周一次。删除可能很昂贵,而且当系统不那么忙时你会想要这样做。