Rumah >pangkalan data >tutorial mysql >Mengapa Saya Tidak Boleh Mengemas kini Jadual MySQL Menggunakan Subkueri Merujuk Jadual Yang Sama dalam Klausa FROM?
Masalah bahawa klausa FROM dalam pernyataan MySQL UPDATE merujuk kepada jadual yang sama
Adegan:
Pertimbangkan jadual MySQL bernama pers
:
<code class="language-sql">CREATE TABLE IF NOT EXISTS `pers` ( `persID` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(35) NOT NULL, `gehalt` int(11) NOT NULL, `chefID` int(11) DEFAULT NULL, PRIMARY KEY (`persID`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ; INSERT INTO `pers` (`persID`, `name`, `gehalt`, `chefID`) VALUES (1, 'blb', 1000, 3), (2, 'as', 1000, 3), (3, 'chef', 1040, NULL);</code>
Soalan:
Percubaan untuk melaksanakan pernyataan UPDATE berikut menghasilkan ralat 1093:
<code class="language-sql">UPDATE pers P SET P.gehalt = P.gehalt * 1.05 WHERE (P.chefID IS NOT NULL OR gehalt < 1000);</code>
Sebab:
Ralat ini berlaku kerana MySQL tidak membenarkan rujukan kepada jadual sasaran dari dalam subkueri dalam pertanyaan KEMASKINI/MASUKKAN/DELETE.
Penyelesaian:
Untuk menyelesaikan masalah ini, subquery perlu ditulis semula untuk menyalin secara eksplisit medan yang diperlukan dalam jadual sasaran ke jadual sementara. Ini boleh dicapai dengan menggantikan contoh jadual sasaran dengan (SELECT * FROM target_table)
. Walau bagaimanapun, subquery tidak diperlukan dalam contoh ini dan boleh diubah suai secara langsung.
Pertanyaan yang betul:
<code class="language-sql">UPDATE pers P SET P.gehalt = P.gehalt * 1.05 WHERE (P.chefID IS NOT NULL OR P.gehalt < 1000);</code>
Pertanyaan yang diubah suai ini menggunakan WHERE
terus dalam klausa P.gehalt
, mengelakkan pengehadan MySQL dan dengan itu mengemas kini jadual pers
dengan betul. Tidak perlu membuat jadual sementara.
Atas ialah kandungan terperinci Mengapa Saya Tidak Boleh Mengemas kini Jadual MySQL Menggunakan Subkueri Merujuk Jadual Yang Sama dalam Klausa FROM?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!