基于另一列的序列列 (PostgreSQL)

Sequence column based on another column (PostgreSQL)

提问人:NeverSleeps 提问时间:8/2/2023 最后编辑:halferNeverSleeps 更新时间:8/5/2023 访问量:46

问:

我有带有此PostgreSQL表的Spring Data - JPA应用程序:

编号 object_id document_name
BDC8B35B型 1 file1_for_obj_1
EA4746抗体 2 file1_for_obj_2
CD4F235C 1 file2_for_obj_1
2天7天5AF9 1 file3_for_obj_1
邮箱:e85824021 2 file2_for_obj_2

我需要添加一列,该列将是序列号,并将考虑列的值。也就是说,这个想法是与一个或另一个相关的行的编号。numberobject_idobject_id

因此,该表应如下所示:

编号 object_id document_name
BDC8B35B型 1 file1_for_obj_1 1
EA4746抗体 2 file1_for_obj_2 1
CD4F235C 1 file2_for_obj_1 2
2天7天5AF9 1 file3_for_obj_1 3
邮箱:e85824021 2 file2_for_obj_2 2

我的第一个想法是创建一个能够产生新值的序列。例如,像这样:

CREATE SEQUENCE _document_sequence
    MINVALUE 1
    START WITH 1000
    INCREMENT BY 1

但在这种情况下,它不会考虑列的值。也就是说,生成可能应该在 java 代码中。此外,我需要进行迁移,以降低现有行的新列的值。但我不知道如何最有效地做到这一点。object_idnumber

postgresql spring-data-jpa 序列

评论


答:

0赞 Belayer 8/3/2023 #1

你无法有效地或有效地做你想做的事。您需要为每个对象 id(先 10K ids 然后 10K 序列)创建一个序列,并且序列中会有间隙。或者,您可以使用一种方法,但这实际上保证了最终的重复。通过创建一个并生成内部来获得您想要的东西的最简单方法。(见演示MAX()+1viewnumber)

create view <view name> as
       select t.*
            , row_number() over(partition by object_id  
                                    order by document_name
                                ) as number
         from <table name> t;