मैं एक कथन में एकाधिक प्रविष्टियां कर रहा हूं उदा .:

INSERT INTO table (foo) VALUES ('aaa'), ('bbb'), ('ccc')

जब मैं अंतिम सम्मिलित आईडी प्राप्त करने का प्रयास करता हूं, तो MySQL (पीडीओ) केवल पहली सम्मिलित आईडी देता है।

चूंकि मुझे पता है कि मैंने कितने आइटम डाले (उपरोक्त उदाहरण से तीन आइटम), क्या जब तक INSERT लेन-देन के रूप में किया जाता है, तब तक सम्मिलित आईडी को मैन्युअल रूप से गणना करना विश्वसनीय है?

उदाहरण के लिए, यदि पहली इंसर्ट आईडी जो MySQL देता है 5 है, तो क्या मैं सुरक्षित रूप से मान सकता हूं कि उपरोक्त INSERT उदाहरण की इंसर्ट आईडी 5, 6, 7? या क्या अभी भी ओवरलैप होने की संभावना है यदि कोई अन्य उपयोगकर्ता उसी समय सम्मिलित करता है, भले ही वे लेनदेन के रूप में किए गए हों?


सुझाया गया डुप्लिकेट प्रश्न, जबकि समान, मेरे प्रश्न का स्पष्ट उत्तर नहीं देता है। वहां स्वीकृत उत्तर केवल यह कहता है कि यह अपेक्षित व्यवहार है कि केवल पहली सम्मिलित आईडी दी गई है, जिसे मैं सहमत हूं, लेकिन मेरा प्रश्न यहां है कि मैन्युअल गणना की विधि कितनी विश्वसनीय है। वहाँ टिप्पणी अनुभाग भी वास्तविक लगता है।

1
IMB 27 जिंदा 2021, 20:05

2 जवाब

सबसे बढ़िया उत्तर

MySQL के JDBC कनेक्टर के लिए कोड id के लगातार होने के बैच पर निर्भर करता है।

MySQL प्रोटोकॉल केवल पहली उत्पन्न आईडी देता है। लेकिन JDBC इंटरफ़ेस के लिए कनेक्टर को एक ऐसी विधि को लागू करने की आवश्यकता होती है जो सभी उत्पन्न आईडी को वापस कर दे। तो यह एक धारणा बनानी चाहिए कि आईडी के बाद पहले लगातार मूल्य हैं।

लेकिन हर नियम के अपवाद हैं।

  • यदि आप एक INSERT निष्पादित करते हैं जो "मिश्रित-मोड" है तो धारणा मान्य नहीं है। इसका मतलब है कि आप एक बहु-पंक्ति INSERT करते हैं जहाँ कुछ पंक्तियाँ एक मान निर्दिष्ट करती हैं लेकिन अन्य पंक्तियाँ एक नई आईडी उत्पन्न होने की उम्मीद करती हैं।

  • यदि आप एक INSERT निष्पादित करते हैं जो "मिश्रित-मोड" या "बल्क" है (बाद वाला INSERT जैसा है... चयन करें या डेटा लोड करें, या कोई अन्य समय जहां पंक्तियों की संख्या पहले से ज्ञात नहीं है), और innodb_autoinc_lock_mode=2 ("इंटरलीव्ड") और किसी अन्य सत्र में किसी भी प्रकार के समवर्ती INSERT हैं, तो आपके INSERT के लिए आईडी का सेट लगातार नहीं हो सकता है।

इन मुद्दों के बारे में अधिक विस्तार से समझने के लिए, https पढ़ें ://dev.mysql.com/doc/refman/8.0/hi/innodb-auto-increment-handling.html ध्यान से।

1
Bill Karwin 27 जिंदा 2021, 20:25
धन्यवाद। इसलिए मुझे लगता है कि जब तक मैं ऑटो-इंक्रीमेंट वैल्यू को मैन्युअल रूप से नहीं कूद रहा हूं, यह धारणा बनाना सुरक्षित है कि आईडी लगातार हैं, अन्य उपयोगकर्ताओं के एक साथ सत्रों की परवाह किए बिना।
 – 
IMB
28 जिंदा 2021, 06:46

मैं धारणा नहीं बनाना पसंद करता हूं।

मुख्य स्थान जहां मैंने कई पंक्तियां डाली हैं, फिर तुरंत उनकी आईडी की आवश्यकता होती है, जब मूल्यों का एक समूह "सामान्यीकृत" होता है, इसलिए मैं इसके बजाय आईडी का उपयोग कर सकता हूं।

ऐसा करते समय:

  1. एक अस्थायी तालिका से शुरू करें जिसमें स्ट्रिंग्स को सामान्यीकृत किया जा रहा है,
  2. आईडी में डालने के लिए INSERT...SELECT DISTINCT ... का उपयोग करें:नाम लुकअप तालिका
  3. UPDATE .. JOIN .. SET temp.id = norm.id WHERE temp.name = norm.name का प्रयोग करें।

यह कुशल, बहु-थ्रेड-सुरक्षित, आदि है। अधिक विवरण: http://mysql. rjweb.org/doc.php/staging_table#normalization

0
Rick James 28 जून 2021, 04:33