Rumah >pangkalan data >tutorial mysql >Mengapa Saya Tidak Boleh Mengemas kini Jadual MySQL Menggunakan Subkueri Merujuk Jadual Yang Sama dalam Klausa FROM?

Mengapa Saya Tidak Boleh Mengemas kini Jadual MySQL Menggunakan Subkueri Merujuk Jadual Yang Sama dalam Klausa FROM?

Patricia Arquette
Patricia Arquetteasal
2025-01-22 19:47:13421semak imbas

Why Can't I Update a MySQL Table Using a Subquery Referencing the Same Table in the FROM Clause?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn