2011-01-09 12 views
32

के साथ उपयोग किया जाता है यदि मैं एक लूप के साथ एकाधिक रिकॉर्ड डालता हूं जो एक रिकॉर्ड डालने को निष्पादित करता है, तो अंतिम डालने वाली आईडी वापस आती है, आखिरी एक। लेकिन अगर मैं एक से अधिक रिकॉर्ड डालने बयान करते हैं:MySQL LAST_INSERT_ID() एकाधिक रिकॉर्ड INSERT कथन

INSERT INTO people (name,age) 
VALUES ('William',25), ('Bart',15), ('Mary',12); 

मान लीजिए कि तीन उपरोक्त तालिका में डाला पहले रिकॉर्ड करते हैं। सम्मिलित कथन के बाद मुझे अंतिम प्रविष्टि आईडी 3 लौटने की उम्मीद थी, लेकिन यह वापस आ गया 1. प्रश्न में कथन के लिए पहली डालने आईडी।

तो क्या कोई व्यक्ति कृपया पुष्टि कर सकता है कि यह एकाधिक रिकॉर्ड INSERT कथन के संदर्भ में LAST_INSERT_ID() का सामान्य व्यवहार है या नहीं। तो मैं इस पर अपना कोड आधार कर सकता हूं।

+0

क्या आपकी तालिका में ऑटो-incrementID है? –

+4

दूसरी दो डालने वाली आईडी आसानी से गणना योग्य हैं। पहले के बाद प्रत्येक रिकॉर्ड के लिए बस एक जोड़ें। – dqhendricks

+2

@dhehendricks क्या आप वाकई आईड्स सही होंगे? जहां तक ​​मुझे innodb के साथ आवेषण पता है, आईडी के एक निश्चित सेट को लॉक न करें और दूसरी प्रक्रिया में प्रवेश हो सकता है, हालांकि मैं इसके बारे में 'INSERT ... मूल्यों' में एकाधिक मानों के लिए निश्चित नहीं हूं ... –

उत्तर

37

हां। last_insert_id() का यह व्यवहार documented in the MySQL docs है:

महत्वपूर्ण
आप एक ही INSERT बयान का उपयोग कर कई पंक्तियां सम्मिलित हैं, LAST_INSERT_ID() केवल पहले डाला पंक्ति के लिए उत्पन्न मान देता है। इसका कारण यह है कि किसी अन्य सर्वर के विरुद्ध INSERT कथन आसानी से पुन: उत्पन्न करना संभव है।

2

इस व्यवहार का उल्लेख man page पर MySQL के लिए किया गया है। यह टिप्पणियों में है लेकिन चुनौती नहीं दी गई है, इसलिए मैं अनुमान लगा रहा हूं कि यह अपेक्षित व्यवहार है।

+0

एफवाईआई: यह व्यवहार वास्तविक MySQL मैन्युअल में दस्तावेज़ित है, न केवल उपयोगकर्ता टिप्पणियों। विवरण के लिए [मेरा जवाब] देखें (http://stackoverflow.com/questions/4637367/mysql-last-insert-id-used-with-multiple-records-insert-statement/7959695#7959695)। – Asaph

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