【问题标题】:Null value in column "id" during insert in Postgres SQL在 Postgresql 中插入期间列“id”中的空值
【发布时间】:2021-06-26 13:16:07
【问题描述】:

表结构messages-

id - Integer - NotNull - Primary Key
message - text - NotNull

当我尝试使用插入时

INSERT INTO messages(message) VALUES ('abc');

它给出了以下错误-

ERROR:  null value in column "id" of relation "messages" violates not-null constraint
DETAIL:  Failing row contains (null, abc).
SQL state: 23502

提前致谢!

【问题讨论】:

  • 修改你的表,使 id 自动递增
  • @Strawberry 这正是我想知道的,关于如何在 Postgres 中做到这一点。
  • 添加您的实体类..确保您已使用 @Id 注释的字段和定义的生成类型 stretegy。
  • 使用数据类型serial而不是整数。

标签: sql postgresql spring-boot


【解决方案1】:

将此添加到您的实体中

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

或者 在 postgres 中将 id 数据类型更改为串行;

id - serial-Primary Key
message - text - NotNull

类似:

CREATE TABLE post (
    id  SERIAL NOT NULL,
    title VARCHAR(255),
    PRIMARY KEY (id)
)

串行使用这个(strategy = GenerationType.IDENTITY)

【讨论】:

  • 我在实体上添加了注释,但仍然无法自动增加 id 的值。另外,第二种解决方案对我来说是不可能的,因为表的结构已经定义了。
  • 重启我的服务器后,它现在可以正常工作了。谢谢:)
  • 欢迎,请告诉我您做了哪些实际更改?
  • 我实际上使用的是@GeneratedValue(strategy = GenerationType.IDENTITY),而id的数据类型是Long,而不是序列。我用AUTO代替了IDENTITY。
  • (strategy = GenerationType.IDENTITY) 解决了我的问题 :)
【解决方案2】:

根据 cmets 将数据类型更改为 serial不是一个选项。在这种情况下,您必须每次都计算新的 id。像这样的简单方法

INSERT INTO post (id, message)
(SELECT MAX(id)+1, ' <message here> ' FROM post);

更好的方法是对 ID 使用序列。但是如果你不能在模式中创建任何东西,那么你就不能使用它。

https://www.postgresql.org/docs/9.5/sql-createsequence.html

【讨论】:

  • 我认为当您使用串行时,它会在内部创建一个序列并对其进行管理。
  • 是的,serial 只是某种序列类型的快捷方式。
猜你喜欢
  • 2016-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-23
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
相关资源
最近更新 更多