我有一张外表 A ,其中包含 foo , bar , baz , qux列即可。列 foo 具有UNIQUE约束。
我有另一张表 B ,其列 id , foo , bar , baz < / strong>。
表 B 取决于表 A ,首先通过将 A 中的所有行插入 B 进行初始化,忽略列 qux 并生成唯一的 id 。
A 每小时刷新一次,每小时后将替换为一张全新的表格。然后我还需要更新 B 。
我想知道什么是最快的查询
1)更新 B 中的所有行,其中 A 中的行具有相同的 foo 值,并且条形或 baz 已更改 bar 和 baz 的新值。
2)插入 A 中的所有行,其中 B 中没有行,且 foo 值相同。
3)删除 B 中的所有行, A 中没有行,且 foo 值相同。
postgresql 中有哪些相应的最佳查询,可以尽快完成这三项操作。
答案 0 :(得分:1)
您需要在UNIQUE
位foo
上b
约束。
1)和2)
INSERT INTO b (foo, bar, baz)
(SELECT foo, bar, baz FROM a)
ON CONFLICT foo
DO UPDATE SET bar = EXCLUDED.bar,
baz = EXCLUDED.baz
WHERE bar <> EXCLUDED.bar
OR baz <> EXCLUDED.baz;
3):
DELETE FROM b
WHERE NOT EXISTS
(SELECT 1
FROM a
WHERE b.foo = a.foo
);
但我认为在b
上a
成为materialized view并刷新它是更好的解决方案。