To lze zjednodušit na:
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
Přidal jsem ORDER BY
klauzuli, kterou striktně nepotřebujete, ale určité dotazy mohou mít prospěch, pokud svá data vložíte takto (nebo jiným) způsobem.
Pokud se chcete vyhnout ztrátě řádků, kde nemůžete najít odpovídající řádek v language
nebo template
, nastavte LEFT JOIN
místo JOIN
pro obě tabulky (za předpokladu, že language_id
a template_id
může být NULL
.
Kromě toho, co jsem již uvedl pod předběžná otázka :Je-li INSERT velký a tvoří velkou část cílové tabulky, je pravděpodobně rychlejší VYHNAT všechny indexy na cílovém stole a poté je znovu vytvořte. Vytváření indexů od začátku je hodně rychleji než je aktualizovat postupně pro každý řádek.
Jedinečné indexy navíc slouží jako omezení, takže budete muset zvážit, zda pravidla vynutit později, nebo je nechat na místě.