问题描述
我想要一个表格,其中对于每个新 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
- 这是插入的不必要开销。