2016-03-27 49 views
0

我需要在另一台服务器上用另一个表(相同列)的数据更新服务器上的一个表。问题是我希望事后清理第一张桌子,就像在这个例子中一样。postgresql - “削减”表数据

之前:

表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

这实在是一个扩展的评论。

看起来好像table2table1的摘要。

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

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

该过程有一个名称“upsert”。在几个数据库中,它使用名为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的新功能,它支持在insert语句on conflict条款(记录here)。

最后,我不建议从table1删除每行更改的行。相反,建立一个不时删除它的工作 - 每小时,每天或每周一次。删除操作可能非常昂贵,而且当系统不太忙时,您可能会想要删除它。