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

时间:2015-04-02 13:47:35

标签: 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类中,table_having_pk

生成ID如下
  @Id
  @GeneratedValue(strategy=GenerationType.AUTO)
  private long id;

2 个答案:

答案 0 :(得分:0)

create table twpk(a text);

insert into twpk values('a'), ('b'), ('c');

create temporary sequence mysequence;

create table twpk2 as
select nextval('mysequence'), a from twpk;

select * from twpk2

答案 1 :(得分:0)

只需省略 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;

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

如果您不想要serial(或不能拥有),您可以动态生成数字:

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