sql >> Database >  >> RDS >> PostgreSQL

Alleen nieuwe rijen in bulk invoegen in PostreSQL

Gegevens importeren

COPY alles naar een tijdelijke verzameltabel en voeg alleen nieuwe titels toe aan uw doeltabel.

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;

ID's moeten automatisch worden gegenereerd met een serial kolom tbl_id in tbl .

De LEFT JOIN / IS NULL construct diskwalificeert reeds bestaande titels. NOT EXISTS zou een andere mogelijkheid zijn.

DISTINCT voorkomt duplicaten in de binnenkomende gegevens in de tijdelijke tabel tmp .

ANALYZE is handig om ervoor te zorgen dat de queryplanner een verstandig plan kiest en dat tijdelijke tabellen niet door autovacuüm worden geanalyseerd.

Aangezien je 3 miljoen items hebt, kan het lonen om de instelling voor temp_buffer te verhogen (alleen voor deze sessie ):

SET temp_buffers = 1000MB;

Of hoeveel u zich ook kunt veroorloven en het is genoeg om de tijdelijke tabel in RAM te houden, wat veel sneller is. Opmerking:moet eerst worden gedaan in de sessie - voordat er tijdelijke objecten worden gemaakt.

ID's ophalen

Om alle ID's voor de geïmporteerde gegevens te zien:

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

In dezelfde sessie! Een tijdelijke tafel wordt automatisch verwijderd aan het einde van de sessie.




  1. PostgreSQL configureren voor bedrijfscontinuïteit

  2. Hoe RTRIM() werkt in MariaDB

  3. MySQL 1062 - Dubbele invoer '0' voor sleutel 'PRIMARY'

  4. scalaire subquery in if-statement Voorwaarde in PL/SQL