Esto se puede simplificar a:
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
Agregué un ORDER BY
cláusula que no necesita estrictamente, pero ciertas consultas pueden beneficiarse si inserta sus datos agrupados de esa manera (o de alguna otra).
Si desea evitar perder filas donde no puede encontrar una fila coincidente en language
o template
, hazlo LEFT JOIN
en lugar de JOIN
para ambas tablas (siempre que language_id
y template_id
puede ser NULL
.
Además de lo que ya enumeré en la precuela de preguntas :si INSERT es enorme y constituye una gran proporción de la tabla de destino, probablemente sea más rápido DROP todos los índices en la tabla de destino y volver a crearlos después. Crear índices desde cero es mucho más rápido que actualizarlos de forma incremental para cada fila.
Los índices únicos también sirven como restricciones, por lo que tendrá que considerar si aplicar las reglas más tarde o dejarlas en su lugar.