postgresql 创建一系列增量SQL表差异?

v1uwarro  于 2023-04-11  发布在  PostgreSQL
关注(0)|答案(1)|浏览(110)

假设我有一个表main,并定期拍摄两个快照t0t1。它具有用于软删除的is_deleted列。

create table t0 as select * from main;
-- wait 1 day
create table t1 as select * from main;

Q1.这个命令是否会创建主表更改的增量快照?

create table main_diffs as
  select * from t1 except
  select * from t0;

Q2.这些命令是否重建t1快照时间的main状态(无索引等)?

create table main_reconstituted as select * from t0;
insert into main_reconstituted select * from main_diffs;

以此类推,每天根据$ t{n-1} $捕获表$ t_{n}$?
上下文:每天捕获大型表的更改,以便通过带宽有限的网络进行分发。
涉及的数据库:postgresql、sqlite、duckdb。

k97glaaz

k97glaaz1#

这两个问题的答案都是“可能”
对于Q1,如果表结构未发生变化,包括:列顺序、添加或删除列或列数据类型;则查询导致递增的行级别差异。
对于Q2,如果满足上面列出的Q1的约束,并且插入行但从不更新,则最终结果将是main_reconstructed具有与main相同的内容。如果允许对main进行更新并且存在合适的唯一密钥,则可以使用INSERT ... ON CONFLICT UPDATE ...来实现所需的结果。
避免在查询中使用*,特别是当列顺序可能影响结果时。如果不允许更新,并且主键是单调递增的值,那么通过选择main中主键值大于前一天快照中最大值的所有行,也可以更有效地创建main_diff。

相关问题