PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como inserir em massa apenas novas linhas no PostreSQL

Importar dados


COPY tudo para uma tabela de preparação temporária e insira apenas novos títulos em sua tabela de destino.
CREATE TEMP TABLE tmp(title text);

COPY tmp FROM 'path/to/file.csv';
ANALYZE tmp;

INSERT INTO tbl
SELECT DISTINCT tmp.title
FROM   tmp 
LEFT   JOIN tbl USING (title)
WHERE  tbl.title IS NULL;

Os IDs devem ser gerados automaticamente com um serial coluna tbl_id em tbl .

O LEFT JOIN / IS NULL construct desqualifica títulos já existentes. NOT EXISTS seria outra possibilidade.

DISTINCT evita duplicatas nos dados de entrada na tabela temporária tmp .

ANALYZE é útil para garantir que o planejador de consulta escolha um plano sensato e que as tabelas temporárias não sejam analisadas pelo autovacuum.

Como você tem 3 milhões de itens, pode valer a pena aumentar a configuração para temp_buffer (somente para esta sessão ):
SET temp_buffers = 1000MB;

Ou o quanto você pode pagar e é suficiente para manter a tabela temporária na RAM, o que é muito mais rápido. Nota:deve ser feito primeiro na sessão - antes de quaisquer objetos temporários serem criados.

Recuperar IDs


Para ver todos os IDs dos dados importados:
SELECT tbl.tbl_id, tbl.title
FROM   tbl
JOIN   tmp USING (title)

Na mesma sessão! Uma tabela temporária é descartada automaticamente no final da sessão.