sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur man bulkinfogar bara nya rader i PostreSQL

Importera data

COPY allt till ett tillfälligt mellanrum och infoga endast nya titlar i din måltabell.

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:n bör genereras automatiskt med en serial kolumn tbl_id i tbl .

LEFT JOIN / IS NULL konstruktion diskvalificerar redan existerande titlar. NOT EXISTS skulle vara en annan möjlighet.

DISTINCT förhindrar dubbletter i inkommande data i den temporära tabellen tmp .

ANALYZE är användbart för att se till att frågeplaneraren väljer en vettig plan och att tillfälliga tabeller inte analyseras med autovakuum.

Eftersom du har 3 miljoner objekt kan det löna sig att höja inställningen för temp_buffer (endast för denna session ):

SET temp_buffers = 1000MB;

Eller hur mycket du har råd med och räcker för att hålla tempbordet i RAM, vilket är mycket snabbare. Obs:måste göras först i sessionen - innan några tillfälliga objekt skapas.

Hämta ID:n

Så här ser du alla ID:n för den importerade datan:

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

I samma session! En tillfällig tabell släpps automatiskt i slutet av sessionen.




  1. Hur man skapar och tar bort databaser och tabeller i MySQL

  2. Måste släppa en databas inte göras i någon transaktion?

  3. Markörbaserad postdatatyp med markör som returnerar flera värden i Oracle-databasen

  4. Konsolidera SQL Server-instanser genom klustring och stapling