我需要使用另一台服务器上另一个表(相同列)的数据更新服务器上的一个表。问题是我想要事后清理第一个表,就像在示例中一样。
之前:
表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 每隔几秒更新一次并且我不能丢失任何数据,我该如何实现?
答案 0 :(得分:1)
这实际上是一个扩展的评论。
似乎table2
是table1
的摘要。
如果您想让它们保持同步,那么您应该在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
删除行。相反,设置一个可以不时删除它们的工作 - 每小时,每天或每周一次。删除可能很昂贵,而且当系统不那么忙时你会想要这样做。