2010-03-30 11 views
122

मैं बयानपाइथन के साथ MySQL डेटाबेस में INSERT के बाद "आईडी" कैसे प्राप्त करूं?

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

में एक सम्मिलित करें निष्पादित और मैं प्राथमिक कुंजी प्राप्त करना चाहते हैं।

मेरे तालिका 2 स्तंभ हैं:

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

कैसे के बाद मैं सिर्फ इस डाला, मैं "आईडी" मिलता है?

+0

http://stackoverflow.com/questions/706755/how-do-you-safely-and- कुशलतापूर्वक-get-the-row-id-after-an-insert-with-mysql-usin – pmav99

उत्तर

158

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

+1

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

+17

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

+3

क्या वर्तमान लेनदेन के बाद ही 'lastrowid' उपलब्ध है? –

3
SELECT @@IDENTITY AS 'Identity'; 

या

SELECT last_insert_id(); 
+2

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

+7

[LAST_INSERT_ID() के लिए, सबसे हाल ही में जेनरेट की गई आईडी सर्वर में प्रति कनेक्शन आधार पर रखी जाती है। यह किसी अन्य ग्राहक द्वारा नहीं बदला जाता है।] (Http://dev.mysql.com/doc/refman/5.5/en/getting-unique-id.html) – Keith

+1

मैं यह इंगित करना चाहता हूं कि यह हिस्सा उतना ही महत्वपूर्ण है: " ग्राहक को निष्पादित अंतिम वक्तव्य के लिए प्रत्येक ग्राहक को अंतिम डाली गई आईडी प्राप्त होगी। " तो आपको लिनक्स मशीन – simplycoding

96

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

>>> 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.lastrowid बहुत सस्ता connection.insert_id() की तुलना में कुछ सस्ता और करने के लिए एक और राउंड ट्रिप से है माई एसक्यूएल।

+2

पर सीएलआई से सटीक वही 'अंतिम_इनर्ट_आईडी() 'को चलाने के बजाय वर्कबेंच से एक अलग मूल्य प्राप्त होगा।' Cursor.lastrowid' 'connection.insert_id()' से सस्ता क्यों है? –

+2

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

+1

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

30

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

id = cursor.lastrowid 

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

+4

यह सबसे उपयुक्त उत्तर है। –

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