PostgreSQL - 使用 2 个自动递增的数字,第 2 个从 1

问题描述

我想要一个表格,其中对于每个新 id,第二个 id(例如修订版)从 1 开始,例如:

id    revision    data

1     1          data1
1     2          data2
2     1          data3
2     2          data4
1     3          data5
3     1          data6

当我想更新数据(行)时,我保留原始行,并创建一个具有相同 ID 但修订版不同的新行。所以我会跟踪表格上所做的更改。

我用这个查询创建了表:

create table my_table (
    id serial not null,revision serial not null,data jsonb not null
    primary key(id,revision)
);

然而,对于这个查询,修订从它离开的地方继续,例如: id 修订数据

1     1          data1
1     2          data2
2     3          data3
2     4          data4
1     5          data5
3     6          data6

如何实现这样的表结构?

解决方法

在这种情况下,您不能使用第二个 SERIAL - 插入新修订时需要使用 MAX(revision) +1

INSERT INTO my_table(id,revision,data) 
  SELECT id,1+COALESCE((SELECT MAX(revision) FROM my_table WHERE id = xxx),0),your_new_data 
  FROM my_table
  WHERE id = xxx
,

您应该通过引入 serial 主键然后在查询表时计算修订来创建表:

create table my_table (
    my_table_id id serial primary key,id int not null,data jsonb not null
);

create view v_my_table as
    select t.*,row_number() over (partition by id order by my_table_id) as revision
    from my_table t;

另一种方法是使用触发器来分配 revision - 这是插入的不必要开销。