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
Lepaskan: 2025-01-22 19:47:13
asal
488 orang telah melayarinya

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:

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);
Salin selepas log masuk

Soalan:

Percubaan untuk melaksanakan pernyataan UPDATE berikut menghasilkan ralat 1093:

UPDATE pers P 
SET P.gehalt = P.gehalt * 1.05 
WHERE (P.chefID IS NOT NULL 
OR gehalt < 1000);
Salin selepas log masuk

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:

UPDATE pers P 
SET P.gehalt = P.gehalt * 1.05 
WHERE (P.chefID IS NOT NULL 
OR P.gehalt < 1000);
Salin selepas log masuk

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 Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan