Това може да се опрости до:
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
Добавих ORDER BY
клауза, която не ви е абсолютно необходима, но определени заявки може да са от полза, ако вмъкнете вашите данни, групирани по този (или друг) начин.
Ако искате да избегнете загубата на редове, където не можете да намерите съответстващ ред на language
или template
, направете го LEFT JOIN
вместо JOIN
и за двете таблици (при условие, че language_id
и template_id
може да бъде NULL
.
В допълнение към това, което вече изброих под предварителен въпрос :Ако INSERT е огромен и съставлява голяма част от целевата таблица, вероятно е по-бързо да ИЗХВЪРЛЯТЕ всички индекси на целевата таблица и ги пресъздайте след това. Създаването на индекси от нулата е много по-бързо, отколкото да ги актуализирате постепенно за всеки ред.
Уникалните индекси допълнително служат като ограничения, така че ще трябва да прецените дали да наложите правилата по-късно или да ги оставите.