Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Kesalahan MySQL 1093 - Tidak dapat menentukan tabel target untuk pembaruan dalam klausa FROM

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara menyisipkan beberapa baris dari array menggunakan kerangka CodeIgniter?

  2. MySQL Membuat tabel dengan Kunci Asing memberikan errno:150

  3. Cara mengekspor data dari SQL Server 2005 ke MySQL

  4. MySQL COALESCE () Dijelaskan

  5. Cara terbaik untuk mendapatkan 'peringkat' seseorang dari tabel skor dengan php dan mysql tanpa perulangan