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