संक्षिप्त उत्तर यह है कि आप TRIGGER में डायनेमिक SQL का उपयोग नहीं कर सकते।
मैं auto_increment मान की क्वेरी से भ्रमित हूं, और आईडी कॉलम के लिए एक मान निर्दिष्ट कर रहा हूं। मुझे समझ में नहीं आता कि आपको आईडी कॉलम का मान सेट करने की आवश्यकता क्यों है। क्या वह कॉलम AUTO_INCREMENT के रूप में परिभाषित नहीं है? डेटाबेस असाइनमेंट को संभालेगा।
यह भी स्पष्ट नहीं है कि आपकी क्वेरी अद्वितीय मान वापस करने की गारंटी है, खासकर जब समवर्ती सम्मिलन चलाए जाते हैं। (मैंने परीक्षण नहीं किया है, इसलिए यह काम कर सकता है।)
लेकिन कोड अजीब है।
ऐसा लगता है कि आप जो हासिल करने की कोशिश कर रहे हैं वह हाल ही में डाली गई पंक्ति से कॉलम का मान प्राप्त करना है। मुझे लगता है कि उसी तालिका से पूछताछ करने पर कुछ प्रतिबंध हैं जिस पर ट्रिगर परिभाषित किया गया है। (मैं निश्चित रूप से जानता हूं कि Oracle में है; MySQL अधिक उदार हो सकता है।)
अगर मुझे ऐसा कुछ करने की ज़रूरत है, तो मैं कुछ ऐसा करने की कोशिश करूंगा:
SELECT @prev_hash := t.hash AS prev_hash
FROM core_Test t
ORDER BY t.ID DESC LIMIT 1;
SET NEW.hash = @prev_hash;
लेकिन फिर, मुझे यकीन नहीं है कि यह काम करेगा (मुझे परीक्षण करने की आवश्यकता होगी)। यदि यह एक साधारण मामले पर काम करता है, तो यह इस बात का प्रमाण नहीं है कि यह हर समय काम करता है, समवर्ती सम्मिलन के मामले में, विस्तारित सम्मिलन के मामले में, आदि।
मैंने क्वेरी को वैसे ही लिखा था जैसे मैंने किया ताकि वह रिवर्स स्कैन ऑपरेशन करने के लिए आईडी कॉलम पर एक इंडेक्स का उपयोग कर सके। यदि यह अनुक्रमणिका का उपयोग नहीं करता है, तो मैं उस क्वेरी को फिर से लिखने का प्रयास करूंगा (संभवतः जॉइन के रूप में, सर्वोत्तम संभव प्रदर्शन प्राप्त करने के लिए।
SELECT @prev_hash := t.hash AS prev_hash
FROM ( SELECT r.ID FROM core_Test r ORDER BY r.ID DESC LIMIT 1 ) s
JOIN core_Test t
ON t.ID = s.ID
MySQL 5.1 संदर्भ मैनुअल से अंश
E.1 संग्रहीत प्रोग्राम पर प्रतिबंध