आप इस तरह से रिकॉर्ड्स को हटा नहीं सकते, मुख्य समस्या यह है कि आप LIMIT क्लॉज का मान निर्दिष्ट करने के लिए सबक्वेरी का उपयोग नहीं कर सकते।
यह काम करता है (MySQL 5.0.67 में परीक्षण किया गया):
DELETE FROM `table`
WHERE id NOT IN (
SELECT id
FROM (
SELECT id
FROM `table`
ORDER BY id DESC
LIMIT 42 -- keep this many records
) foo
);
मध्यवर्ती सबक्वेरी है आवश्यक। इसके बिना हम दो त्रुटियों में भाग लेंगे:
- SQL त्रुटि (1093):आप खंड से अद्यतन के लिए लक्ष्य तालिका 'तालिका' निर्दिष्ट नहीं कर सकते हैं - MySQL आपको उस तालिका को संदर्भित करने की अनुमति नहीं देता जिसे आप सीधे सबक्वेरी में से हटा रहे हैं।
- SQL त्रुटि (1235):MySQL का यह संस्करण अभी तक 'LIMIT &IN/ALL/ANY/SOME सबक्वेरी' का समर्थन नहीं करता है - आप NOT IN ऑपरेटर के सीधे सबक्वेरी में LIMIT क्लॉज का उपयोग नहीं कर सकते।
सौभाग्य से, एक मध्यवर्ती सबक्वेरी का उपयोग करने से हम इन दोनों सीमाओं को बायपास कर सकते हैं।
निकोल ने इंगित किया है कि इस क्वेरी को कुछ उपयोग मामलों (जैसे यह एक) के लिए महत्वपूर्ण रूप से अनुकूलित किया जा सकता है। मैं उस उत्तर को पढ़ने का सुझाव देता हूं साथ ही यह देखने के लिए कि क्या यह आपके लिए उपयुक्त है।