É possível mover dados para a nova tabela originando outras tabelas sem perder o progresso no meio?
Eu penso em plpgsql
ler os dados por partes e confirmar após cada N inserções... Se o processo parar no meio, a condição NOT EXISTS (...)
permite adicionar dados ausentes repetindo o processo novamente.
Eu acho que é um padrão importante e pode haver suporte para ele diretamente com a sintaxe:
INSERT INTO ... SELECT ... WHERE ... AND NOT EXISTS (...)
O motivo da interrupção da cópia pode ser uma restrição ou uma pausa do usuário em uma operação. Ainda queremos não perder o progresso e retomar o processo (com uma ajuda de NOT EXISTS (...)
guarda).
Se for sobre o usuário "pausar" a operação, a
PROCEDURE
ou umaDO
declaração pode ser a escolha certa (Postgres 11+).INSERT
N linhas de cada vez eCOMMIT
após cada iteração. Ver:Pegar após uma interrupção pode ser mais barato se a fonte for estável e você puder acompanhar um ID mínimo crescente ou algo assim.
Mas se for apenas uma restrição que pode gerar uma exceção quando violada, use uma consulta UPSERT para resolver conflitos:
INSERT .. ON CONFLICT ...
. A ação de conflito depende de detalhes não revelados.