我可以用 Postgres 定义一个自调整序列列吗?

Posted

技术标签:

【中文标题】我可以用 Postgres 定义一个自调整序列列吗?【英文标题】:Can I define a self adjusting Sequence column with Postgres? 【发布时间】:2022-01-09 12:10:57 【问题描述】:

我正在运行带有 Postgres 数据库的 EF Core 5,并定义了一些与此类似的实体:

namespace App.Framework.Entities

    public class Parent : EntityBase
    
        [Required]
        public string Name  get; set;  = null!;
    

    public class Child : EntityBase
    
        [Required]
        public string Name  get; set;  = null!;
    

    public class ParentChild : EntityBase
    
        public Guid ParentId  get; set; 

        public Parent Parent  get; set;  = null!;

        public Guid ChildId  get; set; 

        public Child Child  get; set;  = null!;

        [DefaultValue(0)]
        public decimal Sequence  get; set; 
    

从前端,用户可以创建任意数量的父实体或子实体。对于每个 Parent,用户可以分配多个 Child 实体,从而创建 ParentChild 记录。

我很难达到的目标是添加新的 ParentChild 记录,其序列为 1。共享 ParentId 的任何现有 ParentChild 实体都应将其序列增加 1 以适应这一点。

操作顺序大致如下:

创建 ParentA 和 ChildA 将 ChildA 分配给 ParentA - ParentAChildA 使用序列 1 创建 将 ChildB 分配给 ParentA - ParentAChildA 序列变为 2,ParentAChildB 使用序列 1 创建

内置的 Postgres 序列有什么办法允许这种行为吗?

如果没有,有没有比在创建 ParentChild 时手动编码逻辑更好的解决方案?

【问题讨论】:

【参考方案1】:

假设您有一个父表,一个单独的子表,您可以使用序列。

然后做这样的事情:

Create table parent (
 parent_id INT GENERATED ALWAYS AS IDENTITY  ,
 name text
) ;

create table child (
parent_id INT, 
child_id INT GENERATED ALWAYS AS IDENTITY, 
CONSTRAINT fk_parent
  FOREIGN KEY(parent_id) 
  REFERENCES parent(parent_id)
);

这样,在提供 parent_id 的子表中插入将自动对子 ID 进行排序。

【讨论】:

以上是关于我可以用 Postgres 定义一个自调整序列列吗?的主要内容,如果未能解决你的问题,请参考以下文章

Postgres PL/pgSQL,可以声明匿名自定义类型吗?

比较两个序列列,并基于条件将元素添加到 Dataframe

SQL Server Compact Edition - 序列列?

同一 INSERT 期间另一列中序列列的参考值

如何通过添加序列列插入列?

使用样式表自定义 QDial