Isso pode ser simplificado para:
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
Eu adicionei um
ORDER BY
cláusula que você não precisa estritamente, mas certas consultas podem lucrar se você inserir seus dados agrupados dessa maneira (ou de alguma outra). Se você quiser evitar a perda de linhas em que não consegue encontrar uma linha correspondente em
language
ou template
, torne-o LEFT JOIN
em vez de JOIN
para ambas as tabelas (desde que language_id
e template_id
pode ser NULL
. Além do que já listei na pergunta anterior :se o INSERT for enorme e constituir uma grande proporção da tabela de destino, provavelmente será mais rápido DROP todos os índices na tabela de destino e recriá-los depois. Criar índices do zero é muito mais rápido do que atualizá-los incrementalmente para cada linha.
Índices exclusivos também servem como restrições, portanto, você terá que considerar se deve aplicar as regras posteriormente ou deixá-las em vigor.