2010-02-05 17 views
5

क्या मैं समझने में सही हूं कि mysql का LAST_INSERT_ID() फ़ंक्शन सम्मिलित प्रयासों के बीच रीसेट नहीं होता है (जैसे @@ पहचान एसक्यूएल-सर्वर में होती है) ... अगर तुरंत पूर्ववर्ती सम्मिलन ऑपरेशन विफल रहता है, LAST_INSERT_ID() उस कनेक्शन के अंतिम प्रविष्टि के पीके को पर किसी भी तालिका को स्वत: वृद्धिशील प्राथमिक कुंजी के साथ वापस ले जाएगा। और यदि मैं इसमें सही हूं, तो क्या यह इस कार्य के लिए सबसे मंद व्यवहार के बारे में प्रतीत नहीं होता है जिसके साथ कोई भी आ सकता है? क्या कोई mysql फ़ंक्शन नहीं है जो एसक्यूएल-सर्वर की @@ पहचान के समान व्यवहार करता है? एक से पहले तुरंत कोई नया रिकॉर्ड नहीं बनाता है, तो वह वापस लौटाएगा? वैकल्पिक रूप से, किसी को हाल ही में सम्मिलित ऑपरेशन की प्राथमिक कुंजी निश्चित रूप से कैसे पता चलता है?mysql @@ पहचान बनाम एसक्यूएल-सर्वर last_insert_id()

+5

@@ पहचान आप किसी भी क्षेत्र में सबसे हाल ही में डालने देता है। यह एक ट्रिगर का परिणाम हो सकता है जिसमें आपके द्वारा अभी डाले गए सम्मिलन कथन के साथ कुछ भी नहीं है। SQL सर्वर में आप आमतौर पर scope_identity() फ़ंक्शन का उपयोग करना चाहते हैं। – feihtthief

+0

@feihththief - thx, अच्छा स्पष्टीकरण +1 – codemonkey

+0

कृपया ध्यान रखें कि SQL सर्वर की @@ पहचान और scope_identity(), जब एकाधिक प्रोसेसर वाले सर्वर पर एकाधिक-पंक्ति प्रविष्टियों के साथ उपयोग किया जाता है, तो गलत जवाब दे सकते हैं! विकल्प का उपयोग (MAXDOP 1) एक वर्कअराउंड है। – ErikE

उत्तर

6

@@ पहचान आमतौर पर एसक्यूएल सर्वर में भी गलत है। इसके बजाय आपको अधिकांश मामलों में scope_identity() का उपयोग करना चाहिए।

MySQL में, last_insert_id() का उपयोग करने के लिए सुरक्षित होना चाहिए क्योंकि एकमात्र तरीका जिसे आप इस फ़ंक्शन को सम्मिलित त्रुटि के बाद कॉल कर सकते हैं, क्या आप पहले ही सही ढंग से पकड़े गए हैं और सम्मिलित त्रुटि के लिए जिम्मेदार हैं। अन्यथा आप अभी भी कमांड प्रसंस्करण करेंगे। दूसरे शब्दों में, last_insert_id() आपकी त्रुटि-प्रबंधन प्रणाली नहीं है।

+0

@ पैराग्राफ 2 - मुझे इस तरह से पुनर्विचार करता है कि मैं सम्मिलित कथन की संरचना कर रहा हूं ... इस मामले में जहां सम्मिलित भोजन को चुनने वाले चुनिंदा बयान पर क्लॉज निर्धारित करता है कि कोई सम्मिलन बिल्कुल होता है या नहीं। दूसरे शब्दों में, जहां क्लॉज स्थितियों के आधार पर सम्मिलन 0+ रिकॉर्ड है। मुझे लगता है कि मैं उन लोगों को सम्मिलित करने के बाहर खींच सकता हूं और सशर्त रूप से सम्मिलित कर सकता हूं। अच्छा कामकाज, लेकिन यह मेरे लिए एक कामकाज की तरह महसूस करता है। – codemonkey

1

आपको यह देखने के लिए जांचना होगा कि क्या सम्मिलन पहले सफल हुआ था या नहीं। यदि सम्मिलन सफल हुआ, तो आप LAST_INSERT_ID() पर भरोसा कर सकते हैं।

संपादित करें: php में:

<?php 
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password'); 
if (!$link) { 
    die('Could not connect: ' . mysql_error()); 
} 
mysql_select_db('mydb'); 

mysql_query('<PUT YOUR INSERT HERE'); 
if(mysql_affected_rows()>0){ 
    $last_id=mysql_insert_id(); 
}else{ 
    //panic! 
} 
?> 
+0

मुझे आश्चर्य है कि कोई देशी mysql फ़ंक्शन php के msyql_affected_rows() के समान है? हमारे सभी डीएमएल डेटाबेस में संग्रहित प्रक्रियाओं/कार्यों के रूप में रहता है। – codemonkey

+0

http://php.net/manual/en/function.mysql-query.php अन्य प्रकार के SQL कथन, INSERT, अद्यतन, DELETE, DROP, आदि के लिए, mysql_query() सफलता पर त्रुटि या त्रुटि पर गलत लौटाता है। – Notinlist

+1

एक सम्मिलित कथन "सफल" हो सकता है और कोई भी सम्मिलन नहीं कर सकता है। एक इंसर्ट IGNORE कथन पर विचार करें। इस मामले में, mysql_query() के वापसी मूल्य पर भरोसा गलत परिणाम देगा। –

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