Detta kan förenklas till:
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
Jag lade till en ORDER BY klausul som du strikt sett inte behöver, men vissa frågor kan tjäna om du infogar dina data klustrade på det (eller något annat) sätt.
Om du vill undvika att tappa rader där du inte kan hitta en matchande rad på language eller template , gör det till LEFT JOIN istället för JOIN för båda tabellerna (förutsatt att language_id och template_id kan vara NULL .
Utöver det jag redan har listat under förhandsfrågan :Om INSERT är enormt och utgör en stor del av måltabellen är det förmodligen snabbare att SLAPPA alla index på målbordet och återskapa dem efteråt. Att skapa index från början är mycket snabbare än att uppdatera dem stegvis för varje rad.
Unika index fungerar dessutom som begränsningar, så du måste överväga om du ska tillämpa reglerna senare eller lämna dem på plats.