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.