PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come popolare le chiavi esterne di una tabella da altre tabelle

Questo può essere semplificato in:

INSERT INTO translation (id, translated, language_id, template_id)
SELECT tmp.id, tmp.translated, l.id, t.id
FROM   tmp_table tmp
JOIN   language l USING (langname)
JOIN   template t USING (tplname, source, domain)
ORDER  BY tmp.id

Ho aggiunto un ORDER BY clausola di cui non hai strettamente bisogno, ma alcune query potrebbero trarre profitto se inserisci i tuoi dati raggruppati in questo (o in qualche altro) modo.

Se vuoi evitare di perdere righe in cui non riesci a trovare una riga corrispondente in language o template , fallo LEFT JOIN invece di JOIN per entrambe le tabelle (a condizione che language_id e template_id può essere NULL .

Oltre a ciò che ho già elencato nella domanda prequel :Se l'INSERT è enorme e costituisce un'ampia parte della tabella di destinazione, è probabilmente più veloce DROP tutti gli indici sulla tabella di destinazione e ricrearli in seguito. Creare indici da zero è molto più veloce quindi aggiornandoli in modo incrementale per ogni riga.

Gli indici univoci fungono inoltre da vincoli, quindi dovrai considerare se applicare le regole in un secondo momento o lasciarle in vigore.