Duplique eficientemente algumas linhas na tabela do PostgreSQL

Eu tenho o banco de dados PostgreSQL 9 que usa números inteiros de incremento automático como chaves primárias. Desejo duplicar algumas das linhas de uma tabela (com base em alguns critérios de filtro), enquanto altera um ou dois valores, ou seja, copia todos os valores da coluna, exceto o ID (que é gerado automaticamente) e possivelmente outra colun

No entanto, também quero obter o mapeamento de IDs antigos para novos. Existe uma maneira melhor de fazer isso, apenas consultando as linhas para copiar primeiro e depois inserindo novas linhas uma por vez?

Essencialmente, eu quero fazer algo assim:

INSERT INTO my_table (col1, col2, col3)
SELECT col1, 'new col2 value', col3
FROM my_table old
WHERE old.some_criteria = 'something'
RETURNING old.id, id;

No entanto, isso falha comERROR: missing FROM-clause entry for table "old" e vejo o porquê: O Postgres deve primeiro fazer o SELECT e depois inseri-lo e oRETURNINGs cláusulas @ só têm acesso à linha recém-inserid

questionAnswers(5)

yourAnswerToTheQuestion