Ini dapat disederhanakan menjadi:
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
Saya menambahkan ORDER BY klausa yang sebenarnya tidak Anda perlukan, tetapi kueri tertentu mungkin menguntungkan jika Anda memasukkan data yang dikelompokkan dengan cara itu (atau lainnya).
Jika Anda ingin menghindari kehilangan baris di mana Anda tidak dapat menemukan baris yang cocok dalam language atau template , buat LEFT JOIN alih-alih JOIN untuk kedua tabel (asalkan language_id dan template_id bisa NULL .
Selain apa yang sudah saya cantumkan di bawah pertanyaan prekuel :Jika INSERT sangat besar dan merupakan bagian besar dari tabel target, mungkin lebih cepat untuk MENHAPUS semua indeks pada tabel target dan buat ulang setelahnya. Membuat indeks dari awal adalah banyak lebih cepat daripada memperbaruinya secara bertahap untuk setiap baris.
Indeks unik juga berfungsi sebagai batasan, jadi Anda harus mempertimbangkan apakah akan menerapkan aturan nanti atau membiarkannya di tempat.