Pembaruan:Jawaban ini mencakup klasifikasi kesalahan umum. Untuk jawaban yang lebih spesifik tentang cara terbaik menangani kueri OP yang tepat, silakan lihat jawaban lain untuk pertanyaan ini
Di MySQL, Anda tidak dapat mengubah tabel yang sama yang Anda gunakan di bagian SELECT.
Perilaku ini didokumentasikan di:http://dev.mysql.com/doc/refman/5.6/en/update.html
Mungkin Anda bisa bergabung dengan tabel itu sendiri
Jika logikanya cukup sederhana untuk membentuk kembali kueri, hilangkan subkueri dan gabungkan tabel dengan dirinya sendiri, gunakan kriteria pemilihan yang sesuai. Ini akan menyebabkan MySQL melihat tabel sebagai dua hal yang berbeda, yang memungkinkan perubahan destruktif berlanjut.
UPDATE tbl AS a
INNER JOIN tbl AS b ON ....
SET a.col = b.col
Atau, coba susun subkueri lebih dalam ke dalam klausa from ...
Jika Anda benar-benar membutuhkan subquery, ada solusinya, tetapi itu tidak baik karena beberapa alasan, termasuk kinerja:
UPDATE tbl SET col = (
SELECT ... FROM (SELECT.... FROM) AS x);
Subquery bersarang dalam klausa FROM membuat tabel sementara implisit , jadi itu tidak dihitung sebagai tabel yang sama yang Anda perbarui.
... tapi hati-hati dengan pengoptimal kueri
Namun, berhati-hatilah dari MySQL 5.7 .6
dan seterusnya, pengoptimal dapat mengoptimalkan subquery, dan masih memberi Anda kesalahan. Untungnya, optimizer_switch
variabel dapat digunakan untuk mematikan perilaku ini; meskipun saya tidak bisa merekomendasikan melakukan ini sebagai sesuatu yang lebih dari perbaikan jangka pendek, atau untuk tugas kecil satu kali.
SET optimizer_switch = 'derived_merge=off';
Terima kasih kepada Peter V. Mørch untuk saran ini di komentar.
Contoh teknik dari Baron Schwartz, aslinya diterbitkan di Nabble , diparafrasekan dan diperluas di sini.