Dit kan worden vereenvoudigd tot:
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
Ik heb een ORDER BY
. toegevoegd clausule die u niet strikt nodig hebt, maar bepaalde zoekopdrachten kunnen nuttig zijn als u uw gegevens op die (of een andere) manier geclusterd invoert.
Als u wilt voorkomen dat u rijen kwijtraakt waar u geen overeenkomende rij kunt vinden in language
of template
, maak het LEFT JOIN
in plaats van JOIN
voor beide tabellen (op voorwaarde dat language_id
en template_id
kan NULL
zijn .
Naast wat ik al heb vermeld onder de prequelvraag :Als de INSERT enorm is en een groot deel van de doeltabel vormt, is het waarschijnlijk sneller om alle indexen DROP te zetten op de doeltafel en maak ze daarna opnieuw. Het maken van indexen is veel sneller dan ze stapsgewijs bij te werken voor elke rij.
Unieke indexen dienen bovendien als beperkingen, dus u moet overwegen of u de regels later wilt handhaven of laten gelden.