INSERT

2010-06-28 14 views
6

के बिना अंतिम आईडी चुनें, मैं एक तालिका तालिका की आईडी को अन्य तालिका में डालने के लिए पुनः प्राप्त करने का प्रयास कर रहा हूं। मैं last_insert_id() का उपयोग नहीं कर सकता क्योंकि मैंने ए में कुछ भी नहीं डाला है। यह कैसे करना है इस पर कोई विचार अच्छी तरह से?INSERT

SELECT MAX(id) FROM tablename; 

बहरहाल, यह कि आईडी डाल नहीं करता है:

$n = mysql_query("SELECT max(id) FROM tablename"); काम करने के लिए प्रतीत नहीं होता है, और न ही

$n = mysql_query("SELECT max(id) FROM tablename GROUP BY id"); 
+0

कौन सा इंजन? mysql, mssql? पहुंच? – masfenix

+0

"काम नहीं लग रहा है" से आपका क्या मतलब है? –

+0

परिभाषित करें "काम नहीं लग रहा है"। क्या काम नहीं करता है? यह वापस क्या करता है? यह क्या होना चाहिए – CaffGeek

उत्तर

15

MySQL में करता है, इस id स्तंभ से उच्चतम मूल्य वापस नहीं करता है $n में:

$n = mysql_query("SELECT max(id) FROM tablename"); 

मूल्य प्राप्त करने के लिए, यदि आप ऐसा करने की जरूरत है:

$result = mysql_query("SELECT max(id) FROM tablename"); 

if (!$result) { 
    die('Could not query:' . mysql_error()); 
} 

$id = mysql_result($result, 0, 'id'); 

आप एक से पिछले डालने आईडी प्राप्त करने, और बी में डालने के लिए चाहते हैं, आप एक आदेश के साथ कर सकते हैं:

INSERT INTO B (col) SELECT MAX(id) FROM A; 
0

मैं जोड़ने के लिए लगता है प्रत्येक रिकॉर्ड के लिए टाइमस्टैम्प और नवीनतम प्राप्त करें। इस स्थिति में आप किसी भी आईडी, पैक पंक्तियों और अन्य ओप प्राप्त कर सकते हैं।

0

आप कर सकते हैं get maximum column value and increment it:

InnoDB का उपयोग करता के लिए निम्न एल्गोरिथ्म प्रारंभ ऑटो वेतन वृद्धि काउंटर एक मेज टी कि एक AUTO_INCREMENT स्तंभ नामित ai_col शामिल: एक सर्वर स्टार्टअप के बाद, पहले के लिए एक मेज टी में डालने, InnoDB कार्यान्वित इस बयान के बराबर:

SELECT MAX(ai_col) FROM t FOR UPDATE; 

बयान द्वारा पुनर्प्राप्त मूल्य से InnoDB की वृद्धि और को कॉलम पर और तालिका के लिए स्वत: वृद्धि काउंटर को असाइन करता है। तो तालिका खाली है, InnoDB का उपयोग करता मूल्य 1.

इसके अलावा, आप SHOW TABLE STATUS और अपने "AUTO_INCREMENT" मान का उपयोग कर सकते हैं।

+0

यह कैसे सुरक्षित है? –

+0

"अद्यतन के लिए" का अर्थ है कि चयन समाप्त होने तक तालिका को लिखने के लिए बंद कर दिया गया है। निस्संदेह अधिकतम मूल्य का चयन करना बेहतर होगा और एक लेनदेन में डालें जो इन दो तालिकाओं को लॉक करता है। – silent

+1

लिखने के लिए लॉकिंग ?! आउच। –

0

आप descendingly आईडी द्वारा tabele आदेश और एक के लिए परिणामों की संख्या सीमित हो सकती:

SELECT id FROM tablename ORDER BY id DESC LIMIT 1 

लेकिन:ORDER BYपूरे तालिका इस अनुरोध के लिए rearranges। तो यदि आपके पास बहुत अधिक डेटा है और आपको इस ऑपरेशन को कई बार दोहराना होगा, तो मैं इस समाधान की अनुशंसा नहीं करता।

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