使用Postgresql消耗Changes / Deltas

时间:2016-10-12 11:41:16

标签: postgresql upsert

以下是我的情景:

我有2个登陆表source_table和destination_table。

我需要一个查询/查询,它将使用新行以及源表中更新的行更新目标表。

示例数据将是:

source table:
id    name    salary
1     P1      10000
2     P2      20000

target table:
id    name    salary
1     P1      8000

预期的输出应为:

target table:
id    name    salary
1     P1      10000 (salary updated)
2     P2      20000 (new row inserted)

这似乎不起作用:

select * from user_source 
except 
select * from user_target as s

INSERT INTO user_target (id, name, salary) 
VALUES (s.id, s.name, s.salary) WHERE id !=s.id

UPDATE user_target 
  SET name=s.name, salary=s.salary,
WHERE id = s.id

1 个答案:

答案 0 :(得分:0)

对我来说似乎很简单insert ... on conflict

insert into target_table (id, name, salary)
select id, name, salary 
from source_table
on conflict (id) do update 
  set name = excluded.name, 
      salary = excluded.salary;

这假定id列是主要(或唯一)键。查看示例数据(id, name)也可能是唯一的。在这种情况下,您需要更改on conflict()子句,并且显然也会删除名称列的更新。