PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

So fügen Sie in PostreSQL nur neue Zeilen massenhaft ein

Daten importieren

COPY alles zu einem temporären Bereitstellungstisch und nur neue Titel in Ihre Zieltabelle einfügen.

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;

IDs sollten automatisch mit einer serial generiert werden Spalte tbl_id in tbl .

Der LEFT JOIN / IS NULL Konstrukt disqualifiziert bereits bestehende Titel. NOT EXISTS wäre eine andere Möglichkeit.

DISTINCT verhindert Duplikate in den eingehenden Daten in der temporären Tabelle tmp .

ANALYZE ist nützlich, um sicherzustellen, dass der Abfrageplaner einen vernünftigen Plan auswählt und temporäre Tabellen nicht durch Autovacuum analysiert werden.

Da Sie 3 Millionen Artikel haben, kann es sich lohnen, die Einstellung für temp_buffer zu erhöhen (nur für diese Sitzung ):

SET temp_buffers = 1000MB;

Oder wie viel Sie sich leisten können und ausreicht, um die temporäre Tabelle im RAM zu halten, was viel schneller ist. Hinweis:Muss zuerst durchgeführt werden in der Sitzung - bevor temporäre Objekte erstellt werden.

IDs abrufen

So sehen Sie alle IDs für die importierten Daten:

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

In derselben Sitzung! Eine temporäre Tabelle wird am Ende der Sitzung automatisch gelöscht.