java - 如何在 sql INSERT 期间自动生成 ID?

标签 java hibernate postgresql sql-insert row-number

INSERT INTO table_having_pk SELECT * FROM table_without_pk;

两个表的架构相同,只是table_without_pk没有设置主键约束。

问题:在复制过程中,第二个表的条目在 ID 中有 null,因此插入第一个表失败。

org.hibernate.engine.jdbc.spi.SqlExceptionHelper: SQL Error: 0, SQLState: 23502
org.hibernate.engine.jdbc.spi.SqlExceptionHelper: ERROR: NULL-Value in Column ?id? violates Not-Null-Constraint

如何让第一个表在插入过程中自动生成 ID(只需将它们加起来)?

Postgres 9.x

在我的 @Entity 类中,ID 是为 table_having_pk 生成的,如下所示:

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

最佳答案

只需省略 id 列,它将自动为 serial 生成专栏。
您需要添加一个包含所有列的列列表, id 列除外:

INSERT INTO table_having_pk (col1, col2, ...)
SELECT col1, col2, ... FROM table_without_pk;

如果您的列没有序列的默认值(如 serial 那样),您还可以从两者id 列> 表格和:

INSERT INTO table_having_pk
SELECT * FROM table_without_pk;

然后添加一个serial列:

ALTER TABLE table_having_pk ADD COLUMN table_having_pk_id serial PRIMARY KEY;

数字是自动生成的,所以这需要一点时间。每一行都被重写。

或者如果您不想要序列号(或者没有序列号),您可以即时生成数字:

INSERT INTO table_having_pk (id, col1, col2, ...)
SELECT row_number() OVER (), col1, col2, ...
FROM table_without_pk;

关于java - 如何在 sql INSERT 期间自动生成 ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29414590/

相关文章:

java.lang.NoClassDefFoundError : org/apache/chemistry/opencmis/client/api/SessionFactory 错误

java - CPU使用率高会影响JAVA GC吗?

java - 一个初学者关于表单验证的JSF问题

java - Spring @Transactional 在 Hibernate 中产生问题

java - Spring JPA/hibernate : Failed to import bean definitions

Java JPA Hibernate SqlResultSetMapping 别名

java - 在 Action 组合中获取 url 参数

java - 如何实现触发Spring-Data Repository的Before/After save方法

postgresql - 通用 REST API Golang

sql - Postgresql 9.1 中已存在关系 "pk"