PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment insérer en bloc uniquement de nouvelles lignes dans PostreSQL

Importer des données

COPY tout sur une table intermédiaire temporaire et n'insérez que de nouveaux titres dans votre tableau cible.

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;

Les identifiants doivent être générés automatiquement avec un serial colonne tbl_id dans tbl .

Le LEFT JOIN / IS NULL construire disqualifie les titres déjà existants. NOT EXISTS serait une autre possibilité.

DISTINCT empêche les doublons dans les données entrantes dans la table temporaire tmp .

ANALYZE est utile pour s'assurer que le planificateur de requêtes choisit un plan raisonnable et que les tables temporaires ne sont pas analysées par autovacuum.

Puisque vous avez 3 millions d'éléments, il peut être avantageux d'augmenter le paramètre pour temp_buffer (pour cette session uniquement ):

SET temp_buffers = 1000MB;

Ou ce que vous pouvez vous permettre et c'est suffisant pour contenir la table temporaire dans la RAM, ce qui est beaucoup plus rapide. Remarque :doit être effectué en premier dans la session - avant la création de tout objet temporaire.

Récupérer les identifiants

Pour voir tous les identifiants des données importées :

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

Dans la même séance ! Une table temporaire est supprimée automatiquement à la fin de la session.