PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come inserire in blocco solo nuove righe in PostreSQL

Importa dati

COPY tutto su un tavolo di staging temporaneo e inserisci solo nuovi titoli nella tabella di destinazione.

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;

Gli ID dovrebbero essere generati automaticamente con un serial colonna tbl_id in tbl .

Il LEFT JOIN / IS NULL build squalifica i titoli già esistenti. NOT EXISTS sarebbe un'altra possibilità.

DISTINCT impedisce duplicati nei dati in entrata nella tabella temporanea tmp .

ANALYZE è utile per assicurarsi che il pianificatore di query scelga un piano ragionevole e che le tabelle temporanee non vengano analizzate dall'autovacuum.

Dato che hai 3 milioni di elementi, potrebbe essere utile aumentare l'impostazione per temp_buffer (solo per questa sessione ):

SET temp_buffers = 1000MB;

O quanto ti puoi permettere ed è abbastanza per contenere la tabella temporanea nella RAM, che è molto più veloce. Nota:deve essere fatto prima nella sessione - prima che vengano creati oggetti temporanei.

Recupera ID

Per vedere tutti gli ID per i dati importati:

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

Nella stessa sessione! Una tabella temporanea viene eliminata automaticamente alla fine della sessione.