PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak zbiorczo wstawiać tylko nowe wiersze w PostreSQL

Importuj dane

COPY wszystko do tymczasowej tabeli pomostowej i wstawiaj tylko nowe tytuły do ​​tabeli docelowej.

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;

Identyfikatory powinny być generowane automatycznie z serial kolumna tbl_id w tbl .

LEFT JOIN / IS NULL konstrukcja dyskwalifikuje już istniejące tytuły. NOT EXISTS byłaby inna możliwość.

DISTINCT zapobiega duplikatom w przychodzących danych w tabeli tymczasowej tmp .

ANALYZE jest przydatne, aby upewnić się, że planista zapytań wybierze rozsądny plan, a tabele tymczasowe nie są analizowane przez funkcję automatycznego odkurzania.

Ponieważ masz 3 miliony przedmiotów, może być opłacalne podniesienie ustawienia dla temp_buffer (tylko dla tej sesji ):

SET temp_buffers = 1000MB;

Lub na ile możesz sobie pozwolić i wystarczy, aby przechowywać tabelę temp w pamięci RAM, co jest znacznie szybsze. Uwaga:należy to zrobić najpierw w sesji - przed utworzeniem jakichkolwiek obiektów tymczasowych.

Pobierz identyfikatory

Aby zobaczyć wszystkie identyfikatory importowanych danych:

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

W tej samej sesji! Tabela tymczasowa jest automatycznie usuwana na koniec sesji.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. jak przechowywać jsonb PostgreSQL za pomocą SpringBoot + JPA?

  2. Alternatywny format wyjściowy dla psql

  3. Implementacja konfiguracji wielu centrów danych dla PostgreSQL — część pierwsza

  4. Jak zaktualizować wybrane wiersze wartościami z pliku CSV w Postgresie?

  5. PostgreSQL DATEADD() Odpowiednik