Preciso copiar registros dentro de uma mesma tabela alterando apenas um campo. Minha tabela tem uma sequência gerada por padrão entry_id_seq
, porém não tenho certeza se id
a coluna é SERIAL (como verificar isso?).
\d tab
retorna apenas isso
Column | Type | Modifiers
-----------------+--------------------------------+------------------------
id | integer | not null
...
Indexes:
"tab_entry_pkey" PRIMARY KEY, btree (id)
Então o problema é: quando tento copiar registro de forma simplificada:
insert into tab_entry select * from tab_entry where id = 3052;
ele dá erro
ERROR: duplicate key value violates unique constraint "tab_entry_pkey"
DETAIL: Key (id)=(3052) already exists.
A sequência padrão não gera o próximo valor por padrão. Existe alguma sintaxe concisa que permite inserir e alterar um único campo sem especificação de tabela completa aka FROM tab(col1, col2, col3, ..., col N)
?
A tabela tem muitos campos, então não quero escrevê-los todos, pois isso afetará a legibilidade do código. Eu quero algo assim, mas essa sintaxe não funciona
insert into tab_entry(id, *) select nextval('seq'), * from tab_entry where id = 3052;
E essa SELECT nextval('seq')
abordagem funcionará se houver vários registros ao mesmo tempo?
A versão do Psql e Postgres é 9.6.2.