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.