पायथन के साथ MySQL डेटाबेस में INSERT के बाद मुझे "आईडी" कैसे मिलेगा?


182

मैं एक INSERT INTO स्टेटमेंट निष्पादित करता हूं

cursor.execute("INSERT INTO mytable(height) VALUES(%s)",(height))

और मैं प्राथमिक कुंजी प्राप्त करना चाहता हूं।

मेरी तालिका में 2 कॉलम हैं:

id      primary, auto increment
height  this is the other column.

मैं "आईडी" कैसे प्राप्त कर सकता हूं, क्योंकि मैंने इसे डाला था?


जवाबों:


243

का प्रयोग करें cursor.lastrowidअंतिम पंक्ति आईडी कर्सर वस्तु पर डाला पाने के लिए, या connection.insert_id()कि कनेक्शन पर पिछले डालने से आईडी प्राप्त करने के लिए।


3
क्या होगा यदि दो प्रक्रियाएं एक ही कनेक्शन का उपयोग करके एक ही समय में एक पंक्ति सम्मिलित करें। कौन सी आईडी insert_idवापस आएगी?
xiaohan2012

26
@ xiaohan2012 2 प्रक्रियाएं एक ही कनेक्शन का उपयोग कैसे करती हैं?
hienbt88

5
क्या lastrowidवर्तमान में किए गए लेनदेन के बाद ही उपलब्ध है?
जॉन वांग

4
@ hienbt88 वह शायद धागे का मतलब था, मैंने ऐसा किया है और यह तब तक समस्या पैदा कर सकता है जब तक कि आप थ्रेड्सफिटी का सही उपयोग नहीं करते हैं। मैं व्यक्तिगत रूप से प्रत्येक थ्रेड के लिए एक नया कनेक्शन इंस्टेंटिअटिंग करने के लिए गया हूं, जो कि किसी कारण से एक प्यारा वर्कअराउंड है (मेरे लिए वास्तव में काम करना) मेरे लिए काम नहीं करता था, मुझे कई समवर्ती थ्रेड्स के कारण कुछ गंभीर इंटरव्यूइंग मिला, जो सभी को कुछ प्रश्न जारी कर रहे थे प्रति सेकंड।
मिलान वेलेबिट

इन्सर्ट किए गए डुप्लिकेट रिकॉर्ड्स के साथ काम नहीं करता है, सिलेक्ट करें और कहाँ।
ई-जानकारी128

114

इसके अलावा, cursor.lastrowid(MySQLdb द्वारा समर्थित dbapi / PEP249 एक्सटेंशन):

>>> import MySQLdb
>>> connection = MySQLdb.connect(user='root')
>>> cursor = connection.cursor()
>>> cursor.execute('INSERT INTO sometable VALUES (...)')
1L
>>> connection.insert_id()
3L
>>> cursor.lastrowid
3L
>>> cursor.execute('SELECT last_insert_id()')
1L
>>> cursor.fetchone()
(3L,)
>>> cursor.execute('select @@identity')
1L
>>> cursor.fetchone()
(3L,)

cursor.lastrowidconnection.insert_id()माईएसक्यूएल की एक अन्य दौर की यात्रा की तुलना में कुछ सस्ता और बहुत सस्ता है।


4
से cursor.lastrowidसस्ता क्यों है connection.insert_id()?
मार्टिन थोमा

3
केवल इसलिए कि कर्सर.स्ट्रोवॉइड स्वचालित रूप से कर्सर ऑब्जेक्ट पर कर्सर.execute () के हिस्से के रूप में सेट किया गया है और केवल एक विशेषता लुकअप है। connection.insert_id () एक अतिरिक्त अनावश्यक फ़ंक्शन कॉल है - जिसे पहले ही कॉल किया जा चुका है और जिसका परिणाम लास्टअरोइड विशेषता पर उपलब्ध है।
एंड्रयू

5
मुझे सिर्फ एक समस्या है जहां cursor.lastrowidसे कुछ अलग लौटा connection.insert_id()cursor.lastrowidलास्ट इंसर्ट आईडी वापस कर दी, connection.insert_id()वापस कर दी 0। ऐसे कैसे हो सकता है?
मार्टिन थोमा

1
@ बार-बार, शायद समवर्ती प्रक्रियाएं समान कनेक्शन का उपयोग करके समानांतर डेटाबेस प्रविष्टि कर रही हैं।
जिओहान २०१२

1
@FlyingAtom, क्योंकि यह python3 के बजाय python2 पर चलाया गया था।
एंड्रयू

35

पायथन DBAPI कल्पना भी कर्सर वस्तु के लिए 'lastrowid' विशेषता को परिभाषित करता है, इसलिए ...

id = cursor.lastrowid

... भी काम करना चाहिए, और यह स्पष्ट रूप से प्रति-कनेक्शन आधारित है।


7
SELECT @@IDENTITY AS 'Identity';

या

SELECT last_insert_id();

2
यह दौड़ की स्थिति के लिए अनुमति देता है क्योंकि आप सर्वर से अंतिम पंक्ति आईडी का अनुरोध कर रहे हैं। क्योंकि, तुम उस झमेले को नहीं चाहते हो।
यहोशू बर्न्स


1
मैं यह बताना चाहता हूं कि यह हिस्सा उतना ही महत्वपूर्ण है: "प्रत्येक ग्राहक को अंतिम विवरण के लिए अंतिम सम्मिलित आईडी प्राप्त होगी जिसे ग्राहक निष्पादित करता है।" तो तुम Workbench से एक अलग मूल्य से ठीक उसी चल मिलेगा select last_insert_id()एक Linux मशीन पर CLI से
simplycoding
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.