sql >> Databáze >  >> RDS >> PostgreSQL

Jak hromadně vkládat pouze nové řádky v PostreSQL

Import dat

COPY vše do dočasné pracovní tabulky a do cílové tabulky vkládat pouze nové názvy.

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 by měla být generována automaticky s serial sloupec tbl_id v tbl .

LEFT JOIN / IS NULL konstrukt diskvalifikuje již existující tituly. NOT EXISTS byla by další možnost.

DISTINCT zabraňuje duplicitám v příchozích datech v dočasné tabulce tmp .

ANALYZE je užitečné, abyste se ujistili, že plánovač dotazů vybere rozumný plán a dočasné tabulky nebudou analyzovány autovakuem.

Protože máte 3 miliony položek, může se vyplatit zvýšit nastavení pro temp_buffer (pouze pro tuto relaci ):

SET temp_buffers = 1000MB;

Nebo kolik si můžete dovolit a stačí to k udržení tabulky temp v RAM, což je mnohem rychlejší. Poznámka:musí být provedeno nejdříve v relaci - před vytvořením jakýchkoli dočasných objektů.

Načíst ID

Chcete-li zobrazit všechna ID pro importovaná data:

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

Ve stejné relaci! Dočasná tabulka je na konci relace automaticky zrušena.




  1. Nejelegantnější způsob generování permutací na SQL serveru

  2. Převést „čas“ na „datetimeoffset“ v SQL Server (příklady T-SQL)

  3. ORACLE - ORA-01843:neplatný měsíc

  4. Jak mohu použít jarní data jpa k dotazu na sloupec jsonb?