मुझे यकीन नहीं है कि मैं समझता हूं कि यह आपके परिदृश्य के लिए क्यों काम नहीं करता है। TIMESTAMP
है एमएस एसक्यूएल सर्वर में अद्वितीय होने की गारंटी है?
आह - मैं SQL सर्वर टाइमस्टैम्प में देखता हूं rowversion जो कि MySQL के AUTO_INCREMENT
. की तरह है सिवाय इसके कि यह UPDATE
. पर एक नया नीरस रूप से बढ़ता हुआ मान उत्पन्न करता है साथ ही INSERT
. पर भी ।
नहीं, MySQL में ऐसा कुछ नहीं है। न ही MySQL किसी SEQUENCE
का समर्थन करता है Oracle या PostgreSQL या IBM DB2 जैसी वस्तु। उदाहरण के लिए, अनुक्रम आपको ट्रिगर से एक नया मान उत्पन्न करने की अनुमति देगा।
मैंने आपके प्रश्न में आपकी अद्यतन जानकारी पढ़ी है, इसलिए मैं उस समस्या को समझता हूं जिसे आप हल करने का प्रयास कर रहे हैं।
वैकल्पिक समाधान के रूप में मैंने जो देखा है वह उस तालिका में एक और विशेषता जोड़ना है जिसे आप संसाधित कर रहे हैं, इसे is_processed
कहते हैं या कुछ और। जब आप कोई नई पंक्ति डालते हैं तो NULL दर्ज करें। जब आप इसे संसाधित करने के लिए तैयार हो जाते हैं, तो उस कॉलम में मान को 1 में बदल दें। फिर आपको हमेशा पता चलेगा कि आपको किन पंक्तियों को संसाधित करना है - वे पंक्तियाँ होंगी जहाँ is_processed IS NULL
।
अपनी टिप्पणी दें:ठीक है, मुझे समस्या दिखाई दे रही है। प्रत्येक उपयोगकर्ता को अपने स्वयं के दृष्टिकोण की आवश्यकता होती है कि कौन सी पंक्तियाँ नई/परिवर्तित हैं।
एक और हैक जिसे मैंने MySQL में एक अनुक्रम वस्तु का अनुकरण करने के लिए उपयोग किया है, एक तालिका है जिसमें एक ऑटो-इन्क्रीमेंट प्राथमिक कुंजी होती है और कुछ नहीं। आप इस तालिका में सम्मिलित करके नए अद्वितीय नीरस रूप से बढ़ते हुए मान उत्पन्न कर सकते हैं, और फिर सम्मिलित को वापस रोल कर सकते हैं।
CREATE TABLE sequence (id SERIAL) ENGINE=InnoDB; -- Must be InnoDB
START TRANSACTION;
INSERT INTO sequence () VALUES (); -- Yes this is a legal statement.
ROLLBACK;
SELECT LAST_INSERT_ID();
आप MySQL ट्रिगर के भीतर लेन-देन शुरू और रोलबैक नहीं कर सकते हैं, इसलिए आपको अपने एप्लिकेशन कोड में नए मान जेनरेट करने होंगे।
या फिर आप PostgreSQL पर स्विच कर सकते हैं, और दृश्यों के लिए वास्तविक समर्थन प्राप्त कर सकते हैं।