Как автоматически сгенерировать ID во время sql INSERT?

1
INSERT INTO table_having_pk SELECT * FROM table_without_pk;

Схема обеих таблиц одинакова, для table_without_pk не установлены ограничения первичного ключа.

Проблема: во время копирования записи второй таблицы имеют 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

Как я могу позволить 1-й таблице автоматически генерировать идентификаторы (просто подсчитывать их) во время вставки?

Postgres 9.x

Внутри моего класса @Entity идентификатор создается следующим образом для table_having_pk:

  @Id
  @GeneratedValue(strategy=GenerationType.AUTO)
  private long id;
  • 1
    Номера версий для Postgres включают цифры после точки: postgresql.org/support/versioning
Теги:
hibernate
row-number
sql-insert

2 ответа

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;
  • 0
    Будет ли это иметь тот же эффект, если я table_without_pk столбец id из table_without_pk а затем снова напишу insert into table_having_pk select *... ?
  • 0
    Я не могу сделать serial идентификатора, поскольку мне нужно поддерживать автоматически сгенерированную последовательность гибернации, чтобы не нарушать код Java. Могу ли я update столбец id внутри table_without_pk на основе последовательности?
Показать ещё 1 комментарий
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
  • 0
    Не могли бы вы также объяснить свое решение? Такие ответы сильнее, и, скорее всего, проголосуют против.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню