2012-01-05 10 views
14

मुझे पता है कि कैसे LAST_INSERT_ID() स्वत: वृद्धि वाले कॉलम के लिए काम करता है, लेकिन मुझे एक गैर ऑटो वृद्धि वाले कॉलम के लिए डाली गई अंतिम आईडी प्राप्त करने का कोई तरीका नहीं मिल रहा है।क्या MySQL में एक गैर-ऑटो वृद्धि वाले कॉलम की अंतिम डाली गई आईडी प्राप्त करने का कोई तरीका है?

क्या ऐसा कोई तरीका है जो मैं कर सकता हूं?

+4

आईडी ऑटो वेतन वृद्धि नहीं है, तो आप अपने सम्मिलित बयान में यह आपूर्ति करने के लिए है, तो आप पहले से ही यह –

+0

@Darhazer है दूसरे देश में एक और नेटवर्क ....? –

+2

जिस तरह से LAST_INSERT_ID() रिकॉर्ड को सम्मिलित करने वाले सत्र के लिए काम करता है, यह किसी अन्य देश में किसी अन्य नेटवर्क से कुछ भी वापस नहीं करेगा :) –

उत्तर

12

आप उसी LAST_INSERT_ID() का उपयोग करके आसानी से ऐसा कर सकते हैं। संभवतः किसी अन्य अनुप्रयोग में ..., संभवतः एक और मशीन पर, संभवतः पर:

INSERT INTO thetable (id, value) 
VALUES (LAST_INSERT_ID(126), 'some data'); 

SELECT LAST_INSERT_ID(); -- returns 126 
+0

पर आपूर्ति करें। फसल ने मुझे ज्ञान का यह अमूल्य टुकड़ा दिया है ... यह कहा जाना चाहिए कि यहां तक ​​कि 126 के बजाय एक जंजीर चयन का भी उपयोग किया जा सकता है =) – Manatax

+0

क्या यह है एक कनेक्शन पर लगातार? – Manatax

+1

@manatax, यह मान एक नई पंक्ति डालने तक कनेक्शन के भीतर उपलब्ध है, या ऊपर – newtover

0

सं

वहाँ संबंधों, नहीं "अंतिम डाला रिकॉर्ड" की कोई अंतर्निहित आदेश है। यही कारण है कि AUTO_INCREMENT फ़ील्ड मौजूद है।

आपको लॉग इन देखना होगा या अपने आवेदन के अंदर मूल्य को कैश करना होगा।

0

mysql के साथ कोई रास्ता नहीं है। लेकिन आप इसे प्रोग्रामेटिक रूप से कर सकते हैं। स्वत: वृद्धिशील आईडी कॉलम के बिना डेटाबेस को यह जानने का कोई तरीका नहीं है कि कौन से रिकॉर्ड अंतिम बार डाले गए थे।

ऐसा करने का एक तरीका टाइममैम्प या डेटाटाइम मान वाले कॉलम जैसे उपयोग है। और अंतिम सम्मिलित रिकॉर्ड प्राप्त करने के लिए tmestamp के नवीनतम मूल्य की आईडी प्राप्त करें

2

मुझे लगता है कि आप इसे डालने के बाद कुछ अंतिम बिंदु पर इस अंतिम डाली गई आईडी को पुनर्प्राप्त करना चाहते हैं, क्योंकि यदि आपको इसे डालने के बाद सही तरीके से आवश्यकता है तो आप स्पष्ट रूप से पहले से ही पता है कि आईडी क्या है।

एकमात्र तरीका यह है कि आप इसे पाने में सक्षम होंगे, तालिका पर एक और कॉलम है जो इंगित कर सकता है कि कौन सी पंक्ति आखिरी डाली गई थी, जैसे कि टाइमस्टैम्प या डेटाटाइम कॉलम। यदि आपकी आईडी अद्वितीय और बढ़ती हैं, तो आप केवल उस कॉलम का उपयोग कर सकते हैं। फिर आप उस कॉलम द्वारा अवरोही क्रम में आदेश दिया गया 1 पंक्ति का चयन करें।

उदाहरण के लिए

INSERT INTO my_table (id, timestamp) VALUES (123, NOW()) 

SELECT id FROM my_table ORDER BY timestamp DESC LIMIT 1 

संपादित करें: के रूप में नीचे टिप्पणी प्रति, तो आप बहुत से बेहतर कर रहे हैं एक AUTO_INCREMENT स्तंभ का उपयोग, हालांकि इस कॉलम नहीं है id स्तंभ होने के लिए आपको एक ऑटो जोड़ सकता है प्रकार Int के कॉलम और बस इसके द्वारा ऑर्डर करें।

+1

प्रति सेकंड <= 1 प्रविष्टि गारंटी के साथ _very_ छोटे-पैमाने के अनुप्रयोगों के लिए ठीक काम करता है। आप यहां जो कुछ भी कर रहे हैं वह 'ऑटोऑक्रिकमेंट' को फिर से शुरू कर रहा है, लेकिन एक निचले तरीके से! –

+2

ध्यान रखें कि ऑटो-वृद्धिशील कॉलम थ्रेड-सुरक्षित है। एक टाइमस्टैम्प नहीं है। –

+1

आप बिल्कुल सही हैं, मैं बस यह समझाने के लिए अपनी पोस्ट संपादित करने वाला था कि AUTO_INCREMENT कॉलम का उपयोग करना बेहतर है, भले ही यह आईडी के समान कॉलम न हो। –

1

मुझे लगता है कि अंतिम डाली गई पंक्ति को खोजने के लिए आपको अपनी बस डाली गई पंक्ति को ढूंढने के लिए आईडी की आवश्यकता है। किसी वेब एप्लिकेशन में, आप कभी भी यह सुनिश्चित नहीं कर सकते कि अंतिम डाली गई पंक्ति वह है जिसे आपने अभी बनाया है।

आप इस मामले में आईडी के रूप में GUID का उपयोग कर सकते हैं। एक GUID आमतौर पर लंबाई 36 की एक स्ट्रिंग या 16byte ब्लॉब के रूप में संग्रहीत किया जाता है। पंक्ति डालने से पहले GUID बनाया जा सकता है, और फिर पंक्ति डालने के दौरान संग्रहीत किया जा सकता है।

चूंकि आईडी ने कहा है कि आईडी स्वचालित रूप से बढ़ी नहीं है, इसलिए आपको पंक्ति डालने से पहले इसे उत्पन्न करना होगा। ऐसा करने का सबसे सुरक्षित तरीका एक GUID बनाना है जो पर्याप्त अद्वितीय होना चाहिए। अन्यथा आपको अंतिम अप्रयुक्त आईडी निर्धारित करना होगा, जो मुश्किल और जोखिम भरा हो सकता है।

+0

ज्यादातर मामलों में यह लागू समाधान है। यानी अपना खुद का पहचानकर्ता उत्पन्न करें और इसे 'INSERT' कथन – SaidbakR

संबंधित मुद्दे