2008-11-14 10 views
6

मैं हमेशा सुनने के लिए है कि "lastInsertId" (या mysql_insert_id() यदि आप पीडीओ उपयोग नहीं कर रहे) का उपयोग कर बुराई है। ट्रिगर्स के मामले में यह स्पष्ट रूप से है, क्योंकि यह ऐसा कुछ वापस कर सकता है जो आपके INSERT द्वारा बनाई गई अंतिम आईडी नहीं है।वैकल्पिक "पीडीओ :: lastInsertId"/"mysql_insert_id"

$DB->exec("INSERT INTO example (column1) VALUES ('test')"); 
// Usually returns your newly created ID. 
// However when a TRIGGER inserts into another table with auto-increment: 
// -> Returns newly created ID of trigger's INSERT 
$id = $DB->lastInsertId(); 

विकल्प क्या है?

उत्तर

2

यदि आप एडीओडीबी (http://adodb.sourceforge.net/) के मार्ग पर जाते हैं, तो आप हाथ से पहले सम्मिलित आईडी बना सकते हैं और डालने पर स्पष्ट रूप से आईडी निर्दिष्ट कर सकते हैं। इसे पोर्टेबल रूप से कार्यान्वित किया जा सकता है (एडीओडीबी विभिन्न डेटाबेसों का एक टन का समर्थन करता है ...) और गारंटी देता है कि आप सही डालने आईडी का उपयोग कर रहे हैं।

पोस्टग्रेएसक्यूएल सीरियल डेटा प्रकार समान है कि यह प्रति-तालिका/प्रति-अनुक्रम है, आप तालिका/अनुक्रम निर्दिष्ट करते हैं जब आप अनुरोध करते समय अंतिम प्रविष्टि आईडी चाहते हैं।

+0

+1 मैंने लिखा मेरा जवाब जब आप अपना लिख ​​रहे थे –

+0

काफी दिलचस्प लग रहा है। इस तकनीक पर प्रदर्शन पर कौन सा प्रभाव पड़ता है? – BlaM

+2

हाँ, लेकिन यदि आप पीडीओ के साथ फंस गए हैं तो आप क्या करते हैं? – Elijah

0

यह परिष्कृत नहीं है और यह कुशल नहीं है, लेकिन अगर डेटा आप डाला है अद्वितीय क्षेत्र शामिल है, तो एक का चयन करें स्पष्ट रूप से प्राप्त हो सकते हैं क्या आप के बाद कर रहे हैं।

उदाहरण के लिए:

INSERT INTO example (column1) VALUES ('test'); 
SELECT id FROM example WHERE column1 = 'test'; 
+0

जाहिर है;) - लेकिन यह भी स्पष्ट रूप से काफी बदसूरत;) – BlaM

1

मुझे लगता है कि यह या तो कला के राज्य वास्तव में नहीं है, लेकिन मैं लिखने ताले का उपयोग सुनिश्चित करें कि मैं वास्तव में पिछले डाला आईडी प्राप्त करने के लिए।

+0

जाहिर भी काम कर रहा है - लेकिन IMHO ताला भी उच्च निष्पादन वेब एप्लिकेशन में अधिक बुराई है ... – BlaM

4

IMHO इसे केवल "बुरा" माना जाता है क्योंकि शायद ही कोई अन्य SQL डेटाबेस (यदि कोई है) है।

व्यक्तिगत तौर पर मैं यह अविश्वसनीय रूप से उपयोगी पाते हैं, और चाहते हैं कि मैं अन्य सिस्टम पर अन्य अधिक जटिल तरीकों का सहारा लेना नहीं था।

+0

कम से कम MSSQL एक ही सुविधा है। "डालने आईडी" का उपयोग करते हुए मेरी पुरानी नौकरी में प्रमुख सिरदर्द पैदा हुए हैं जब किसी ने एक टेबल पर एक ट्रिगर जोड़ा जो पूरी वेबसाइट तोड़ देता है - उन लोगों के लिए स्पष्ट कारण के बिना जो उस ट्रिगर के बारे में नहीं जानते थे ... – BlaM

3

एक विकल्प इसके बजाय अनुक्रमों का उपयोग करना है, इसलिए आप डालने से पहले स्वयं आईडी उत्पन्न करते हैं।

दुर्भाग्य से वे MySQL में समर्थित नहीं हैं लेकिन adodb तरह पुस्तकालयों एक और तालिका का उपयोग कर उन्हें अनुकरण कर सकते हैं। मैं फिर भी लगता है कि अनुकरण ही lastInsertId() या समकक्ष का उपयोग करेगा ... लेकिन कम से कम आप कम एक मेज जो विशुद्ध रूप से एक दृश्य के लिए प्रयोग किया जाता है

-3

आप इस कोशिश कर सकते पर एक ट्रिगर होने की संभावना है:

$sql = "SELECT id FROM files ORDER BY id DESC LIMIT 1"; 
$PS = $DB -> prepare($sql); 
$PS -> execute(); 
$result = $PS -> fetch(); 
+3

यह उच्च-ट्रैफिक वातावरण में कोई विकल्प नहीं है। आपको लगातार गलत आईडी मिलेंगी। – BlaM