अद्यतन: यह उत्तर सामान्य त्रुटि वर्गीकरण को कवर करता है। ओपी की सटीक क्वेरी को सर्वश्रेष्ठ तरीके से कैसे प्रबंधित करें, इस बारे में अधिक विशिष्ट उत्तर के लिए, कृपया इस प्रश्न के अन्य उत्तर देखें
MySQL में, आप उसी तालिका को संशोधित नहीं कर सकते हैं जिसका आप चयन भाग में करते हैं।
इस व्यवहार का दस्तावेजीकरण किया जाता है:
http://dev.mysql.com/doc/refman/5.6/en/update.html
हो सकता है कि आप सिर्फ तालिका में शामिल हो सकते हैं
यदि तर्क क्वेरी को फिर से आकार देने के लिए पर्याप्त सरल है, तो उचित चयन मानदंडों को नियोजित करते हुए, सबक्वेरी खो दें और तालिका में खुद को शामिल करें। इससे MySQL तालिका को दो अलग-अलग चीजों के रूप में देखेगा, जिससे विनाशकारी परिवर्तन आगे बढ़ सकते हैं।
UPDATE tbl AS a
INNER JOIN tbl AS b ON ....
SET a.col = b.col
वैकल्पिक रूप से, उपवाक्य को उपवाक्य से गहरे में घोंसला बनाने की कोशिश करें ...
यदि आपको पूरी तरह से सबक्वेरी की जरूरत है, तो वर्कअराउंड है, लेकिन यह प्रदर्शन सहित कई कारणों से बदसूरत है:
UPDATE tbl SET col = (
SELECT ... FROM (SELECT.... FROM) AS x);
FROM क्लॉज में नेस्टेड सबक्विरी एक अंतर्निहित अस्थायी तालिका बनाता है , इसलिए यह उसी तालिका में गणना नहीं करता है जिसे आप अपडेट कर रहे हैं।
... लेकिन क्वेरी ऑप्टिमाइज़र के लिए देखें
हालाँकि, सावधान रहें कि MySQL 5.7.6 और उसके बाद, ऑप्टिमाइज़र सबक्वेरी को ऑप्टिमाइज़ कर सकता है, और फिर भी आपको त्रुटि दे सकता है। सौभाग्य से, optimizer_switch
इस व्यवहार को बंद करने के लिए चर का उपयोग किया जा सकता है; हालाँकि मैं इसे शॉर्ट टर्म फिक्स या छोटे वन-ऑफ कार्यों से अधिक कुछ भी करने की सलाह नहीं दे सकता।
SET optimizer_switch = 'derived_merge=off';
टिप्पणी में इस सलाह के लिए पीटर वी। मॉरच को धन्यवाद ।
उदाहरण तकनीक बैरन श्वार्ट्ज से थी, जो मूल रूप से नाबले में प्रकाशित हुई थी , यहां पर चर्चा की गई थी और इसे बढ़ाया गया था।