Dies kann vereinfacht werden zu:
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
Ich habe einen ORDER BY
hinzugefügt Klausel, die Sie nicht unbedingt benötigen, aber bestimmte Abfragen können davon profitieren, wenn Sie Ihre Daten auf diese (oder eine andere) Weise geclustert einfügen.
Wenn Sie vermeiden möchten, dass Zeilen verloren gehen, wenn Sie keine übereinstimmende Zeile in language
finden oder template
, machen Sie daraus LEFT JOIN
statt JOIN
für beide Tabellen (vorausgesetzt, dass language_id
und template_id
kann NULL
sein .
Zusätzlich zu dem, was ich bereits unter der Vorabfrage aufgeführt habe :Wenn der INSERT sehr groß ist und einen großen Teil der Zieltabelle ausmacht, ist es wahrscheinlich schneller, alle Indizes zu löschen auf der Zieltabelle und erstellen Sie sie anschließend neu. Das Erstellen von Indizes von Grund auf ist viel schneller, als sie inkrementell für jede Zeile zu aktualisieren.
Eindeutige Indizes dienen zusätzlich als Einschränkungen, sodass Sie überlegen müssen, ob Sie die Regeln später durchsetzen oder sie beibehalten möchten.