【问题标题】:postgresql - "cut" table datapostgresql - “剪切”表数据
【发布时间】:2016-07-14 18:32:55
【问题描述】:

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

之前:

表 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 每隔几秒更新一次并且我不能丢失任何数据,我该如何实现?

【问题讨论】:

    标签: sql postgresql merge truncate


    【解决方案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 中删除行。相反,设置一个不时删除它们的作业——每小时、每天或每周一次。删除可能代价高昂,您可能希望在系统不那么繁忙时执行此操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多