使用 Postgresql 使用更改/增量
Consume The Changes / Deltas using Postgresql
以下是我的场景:
我有 2 个着陆点 tables source_table 和 destination_table。
我需要一个 query/queries,它将使用新行以及来自源 table 的更新行更新目标 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
对我来说似乎很简单 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()
子句并显然也删除名称列的更新。
以下是我的场景:
我有 2 个着陆点 tables source_table 和 destination_table。
我需要一个 query/queries,它将使用新行以及来自源 table 的更新行更新目标 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
对我来说似乎很简单 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()
子句并显然也删除名称列的更新。