sql >> Base de Datos >  >> RDS >> PostgreSQL

Cómo insertar masivamente solo filas nuevas en PostreSQL

Importar datos

COPY todo a una mesa de montaje temporal e inserte solo títulos nuevos en su tabla 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;

Los ID deben generarse automáticamente con un serial columna tbl_id en tbl .

El LEFT JOIN / IS NULL construir descalifica los títulos ya existentes. NOT EXISTS sería otra posibilidad.

DISTINCT evita duplicados en los datos entrantes en la tabla temporal tmp .

ANALYZE es útil para asegurarse de que el planificador de consultas elija un plan sensato y que las tablas temporales no sean analizadas por autovacuum.

Dado que tiene 3 millones de elementos, podría valer la pena aumentar la configuración de temp_buffer (solo para esta sesión ):

SET temp_buffers = 1000MB;

O por mucho que pueda pagar y sea suficiente para mantener la tabla temporal en RAM, que es mucho más rápido. Nota:debe hacerse primero en la sesión, antes de que se creen objetos temporales.

Recuperar identificaciones

Para ver todos los ID de los datos importados:

SELECT tbl.tbl_id, tbl.title
FROM   tbl
JOIN   tmp USING (title)

¡En la misma sesión! Una tabla temporal se elimina automáticamente al final de la sesión.