Menyelesaikan masalah MySQL "Anda tidak boleh menentukan jadual sasaran untuk kemas kini dalam klausa FROM" Ralat
Isunya:
Menghadapi ralat "Anda tidak boleh menentukan jadual sasaran untuk kemas kini dalam klausa FROM" semasa pernyataan UPDATE
MySQL yang menyasarkan jadual (cth., pers
) menunjukkan had dalam pemprosesan pertanyaan MySQL.
Contoh Senario:
Katakan anda mempunyai pertanyaan UPDATE
berikut:
<code class="language-sql">UPDATE pers P SET P.gehalt = P.gehalt * 1.05 WHERE (P.chefID IS NOT NULL OR gehalt < ... ); </code>
Pertanyaan ini cuba mengemas kini lajur gehalt
dalam jadual pers
berdasarkan keadaan yang melibatkan jadual pers
yang sama, menyebabkan ralat.
Mengapa Ini Berlaku:
Sekatan MySQL menghalang kemas kini yang samar-samar di mana fasal FROM
boleh membawa kepada pengubahsuaian yang tidak diingini.
Penyelesaian:
Penyelesaian melibatkan mencipta alias sementara jadual menggunakan subquery:
<code class="language-sql">UPDATE pers P SET P.gehalt = (SELECT T.gehalt * 1.05 FROM (SELECT * FROM pers) AS T WHERE T.persID = P.persID) WHERE (P.chefID IS NOT NULL OR P.gehalt < ...);</code>
Pertanyaan yang disemak ini mengelakkan rujukan langsung kepada pers
dalam pernyataan UPDATE
itu sendiri. Subkueri (SELECT * FROM pers) AS T
mencipta alias jadual sementara T
, membenarkan pernyataan UPDATE
merujuk data yang diperlukan tanpa melanggar peraturan MySQL.
Nota Penting:
Semasa menggunakan SELECT *
memudahkan contoh, untuk prestasi optimum, pilih hanya lajur yang diperlukan daripada jadual pers
dalam subkueri. Sentiasa masukkan klausa WHERE
yang berkaitan dalam subkueri anda untuk memastikan pengambilan data yang cekap. Dalam contoh di atas, WHERE T.persID = P.persID
adalah penting untuk memadankan baris dengan betul antara pernyataan UPDATE
utama dan subkueri.
Atas ialah kandungan terperinci Bagaimana untuk Menyelesaikan Ralat 'Anda tidak boleh menentukan jadual sasaran untuk kemas kini dalam klausa FROM' MySQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!