如何在postgresql中设置与id不同的自动增量字段

Posted

技术标签:

【中文标题】如何在postgresql中设置与id不同的自动增量字段【英文标题】:How to set auto-increment field in postgresql different than id 【发布时间】:2019-06-18 00:34:54 【问题描述】:

我在 postgresql 表中有 id 列和 position 列。我想定位自动增量,所以我使用 serial 数据类型添加了 positionALTER TABLE tbl ADD COLUMN position serial;

id       name     position
-------  -------  -------
1        S4       4
2        S2       2
3        S3       3
4        S1       1

问题是当我尝试创建新对象时出现以下错误: org.postgresql.util.PSQLException: error: PSQLException: ERROR: null value in column "position" violates not-null

如何设置position列自动递增?

我的普通对象:

public class Stg 

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
    @SequenceGenerator(name = "sequenceGenerator")
    private Long id;

    @NotNull
    @Size(max = 20)
    @Column(name = "name", length = 20, nullable = false)
    private String name;

    private Integer position;

【问题讨论】:

你的 Postgres 版本是什么? @TimBiegeleisen 10.1 你的 INSERT 语句是什么? 您的 alter 语句本身不应导致此错误 AFAIK。 @404 我放入语句中的值看起来像 (5, S5, null) 所以位置显然是 null 但是我没有 id 的问题 - 它是生成的 【参考方案1】:

第一个你需要创建序列:

CREATE SEQUENCE sys_sequence_name START -9223372036854775808 MINVALUE -9223372036854775808 MAXVALUE 9223372036854775807;

然后创建表,但在声明行参数添加后

CREATE TABLE table_name (

id          bigserial primary key,
var_with_seq    bigint not null default nextval('sys_sequence_name')

nextval('sys_sequence_name') - 这将使用您创建的序列。

【讨论】:

我应该在 Stg 类的 position 字段中添加一些注释吗? 您可以在私有整数位置上方添加@SequenceGenerator(name="sys_sequence_name") 并添加 @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="sys_sequence_name") 我之前尝试过使用此注释,但它不起作用。 postgres 中的序列效果很好,但 java 仍然尝试将 null 放入位置 hmm,尝试添加注解 @SequenceGenerator(name = "sys_seq_position_name", sequenceName = "sys_sequence_name",allocationSize = 1) @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="sys_sequence_position_name") @ Column(name="position", insertable=false) private 多头头寸

以上是关于如何在postgresql中设置与id不同的自动增量字段的主要内容,如果未能解决你的问题,请参考以下文章

如何在 React 中设置与主页的正文图像不同的样式?

如何在 GCP 中设置与 MongoDB Docker 容器的连接

如何在 Kubernetes 上的 Quarkus 中设置与 Keycloak 的 OIDC 连接

如何在 PEP484 之后的方法参数中设置与类相同的类型? [复制]

如何在 Perl 中设置与 DBIx::Class 的多主列 1:n 关系?

在 THREE.JS 中设置与两个网格的最小距离