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.