【问题标题】:PostgreSQL - Using 2 auto-incremented numbers, the 2nd one restarts from 1 [duplicate]PostgreSQL - 使用 2 个自动递增的数字,第二个从 1 重新开始 [重复]
【发布时间】:2021-06-27 07:22:51
【问题描述】:

我想要一个表格,对于每个新的 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

如何实现这样的表结构?

【问题讨论】:

  • 为什么需要它?您可以使用row_number 获取序列号。
  • 我有点迷路了。如果id是串行的,为什么会重复?

标签: sql postgresql auto-increment


【解决方案1】:

在这种情况下,您不能使用第二个 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

【讨论】:

    【解决方案2】:

    您应该通过引入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——这是插入时不必要的开销。

    【讨论】:

    • 我会在表中添加一列 revision_timestamp TIMESTAMP NOT NULL DEFAULT NOW() 并将视图代码更改为按 revision_timestamp 排序以更具确定性,否则您不指定哪个是行中的顺序具有相同id
    • @Ftisiot。 . .我确定了答案。目的是使用my_table_id 进行订购。
    猜你喜欢
    • 1970-01-01
    • 2013-03-01
    • 1970-01-01
    • 2013-10-27
    • 1970-01-01
    • 2013-01-27
    • 2016-10-12
    • 1970-01-01
    • 2014-09-27
    相关资源
    最近更新 更多