Cela peut être simplifié en :
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
J'ai ajouté un ORDER BY
clause dont vous n'avez pas strictement besoin, mais certaines requêtes peuvent être utiles si vous insérez vos données regroupées de cette manière (ou d'une autre manière).
Si vous voulez éviter de perdre des lignes où vous ne pouvez pas trouver une ligne correspondante en language
ou template
, faites-le LEFT JOIN
au lieu de JOIN
pour les deux tables (à condition que language_id
et template_id
peut être NULL
.
En plus de ce que j'ai déjà répertorié sous la question préquelle :Si l'INSERT est énorme et constitue une grande partie de la table cible, il est probablement plus rapide de DROP tous les index sur la table cible et recréez-les ensuite. Créer des index à partir de zéro est beaucoup plus rapidement que de les mettre à jour progressivement pour chaque ligne.
Les index uniques servent également de contraintes, vous devrez donc déterminer s'il faut appliquer les règles plus tard ou les laisser en place.