LAST_INSERT_ID () MySQL


151

मेरा एक MySQL सवाल है जो मुझे लगता है कि काफी आसान होना चाहिए। जब मैं निम्नलिखित MySql क्वेरी चलाता हूं, तो मुझे तालिका 1 से पिछली INSERTED आईडी को वापस करना होगा।

INSERT INTO table1 (title,userid) VALUES ('test',1); 
INSERT INTO table2 (parentid,otherid,userid) VALUES (LAST_INSERT_ID(),4,1);
SELECT LAST_INSERT_ID();

जैसा कि आप समझ सकते हैं कि वर्तमान कोड बस टेबल 1 के बजाय तालिका 2 की अंतिम INSERT आईडी वापस कर देगा, मैं तालिका 1 से आईडी कैसे प्राप्त कर सकता हूं, भले ही मैं तालिका 2 के बीच डालूं?

जवाबों:


248

आप अंतिम आवेषण आईडी को एक चर में संग्रहीत कर सकते हैं:

INSERT INTO table1 (title,userid) VALUES ('test', 1); 
SET @last_id_in_table1 = LAST_INSERT_ID();
INSERT INTO table2 (parentid,otherid,userid) VALUES (@last_id_in_table1, 4, 1);    

या अधिकतम आईडी frm table1 प्राप्त करें

INSERT INTO table1 (title,userid) VALUES ('test', 1); 
INSERT INTO table2 (parentid,otherid,userid) VALUES (LAST_INSERT_ID(), 4, 1); 
SELECT MAX(id) FROM table1;   

5
धन्यवाद! जैसा कि मैंने MySQL के साथ asp.net का उपयोग कर रहा था, मैं इसे पहले काम नहीं कर पाया और चर को अनुमति देने के लिए कनेक्शन स्ट्रिंग के लिए अनुमति दें उपयोगकर्ता चर = सत्य को जोड़ने की आवश्यकता थी।
मार्टिन

114
अधिकतम एक अच्छा विचार नहीं है, क्योंकि आप किसी अन्य आवेषण के साथ एक दौड़ खो सकते हैं।
रोब स्टारिंग

5
@ रॉब्स्ट्रलिंग मैं पूरी तरह से सहमत हूं, लेकिन अगर किसी को पूरी तरह से इसकी आवश्यकता है; उचित अलगाव स्तर के साथ लेनदेन का उपयोग करें।
इदियाकापी

8
क्या होगा अगर 2 इंसर्ट उसी समय खुश हो जाएं या एक दूसरे से पहले?
FosAvance

32
@FosAvance LAST_INSERT_ID () कनेक्शन विशिष्ट रेफरी है
मोमिन अल अज़ीज़

18

चूंकि आपने वास्तव में पिछली LAST_INSERT_ID () को दूसरी तालिका में संग्रहीत किया है, आप इसे वहां से प्राप्त कर सकते हैं:

INSERT INTO table1 (title,userid) VALUES ('test',1); 
INSERT INTO table2 (parentid,otherid,userid) VALUES (LAST_INSERT_ID(),4,1);
SELECT parentid FROM table2 WHERE id = LAST_INSERT_ID();

13

यह आपको 2 अलग-अलग तालिकाओं में एक पंक्ति सम्मिलित करने में सक्षम बनाता है और दोनों तालिकाओं के लिए एक संदर्भ भी बनाता है।

START TRANSACTION;
INSERT INTO accounttable(account_username) 
    VALUES('AnAccountName');
INSERT INTO profiletable(profile_account_id) 
    VALUES ((SELECT account_id FROM accounttable WHERE account_username='AnAccountName'));
    SET @profile_id = LAST_INSERT_ID(); 
UPDATE accounttable SET `account_profile_id` = @profile_id;
COMMIT;

1
लेन-देन पर अच्छा शॉट।
कर्ट वान डेन ब्रेंडेन

1
लेकिन: केवल InnoDB पर उपलब्ध है।
रासलीला

4

मुझे बैश में भी यही समस्या थी और मैं कुछ ऐसा कर रहा हूं:

mysql -D "dbname" -e "insert into table1 (myvalue) values ('${foo}');"

जो ठीक काम करता है :-) लेकिन

mysql -D "dbname" -e "insert into table1 (myvalue) values ('${foo}');set @last_insert_id = LAST_INSERT_ID();"
mysql -D "dbname" -e "insert into table2 (id_tab1) values (@last_insert_id);"

काम नहीं करते। क्योंकि पहले कमांड के बाद, शेल को mysql से लॉग आउट किया जाएगा और दूसरी कमांड के लिए फिर से लॉग इन किया जाएगा, और फिर चर @last_insert_id को अब सेट नहीं किया गया है। मेरा समाधान है:

lastinsertid=$(mysql -B -N -D "dbname" -e "insert into table1 (myvalue) values ('${foo}');select LAST_INSERT_ID();")
mysql -D "dbname" -e "insert into table2 (id_tab1) values (${lastinsertid});"

शायद किसी को एक समाधान के लिए खोज रहा है :-)


LAST_INSERT_IDकेवल सक्रिय कनेक्शन के लिए उपलब्ध है। #mysq-कमांड हर कमांड के लिए कनेक्ट। आप mysqlकमांड के साथ सर्वर से जुड़ सकते हैं और अपने प्रश्नों को सम्मिलित कर सकते हैं, या आप एक टेक्स्ट फ़ाइल बना सकते हैं और आप mysqlकमांड को txt फ़ाइल aka से पुनः निर्देशित कर सकते हैंmysql [connection option] < txt.file
raiserle

1

हमारे पास केवल एक व्यक्ति रिकॉर्ड दर्ज कर रहा है, इसलिए मैं निम्नलिखित क्वेरी को सम्मिलित रूप से तुरंत निष्पादित करता हूं:

$result = $conn->query("SELECT * FROM corex ORDER BY id DESC LIMIT 1");

while ($row = $result->fetch_assoc()) {

            $id = $row['id'];

}

यह डेटाबेस से अंतिम आईडी को पुनः प्राप्त करता है।


1
मुझे एक वैध उदाहरण देना था, इसलिए मैंने जो उपयोग किया, उसका उपयोग किया। अगर मैंने इसे C में किया था, तो आपको शायद "हर एक C का उपयोग नहीं करने" की शिकायत होगी ....
sspence65

संभवतः सबसे सुरक्षित और सबसे सरल;)
अंजना सिल्वा

1

कोई InnoDB समाधान के लिए: आप एक प्रक्रिया का उपयोग कर सकते हैं don't forgot to set the the delimiter for storing the procedure with ;

CREATE PROCEDURE myproc(OUT id INT, IN otherid INT, IN title VARCHAR(255))
BEGIN
LOCK TABLES `table1` WRITE;
INSERT INTO `table1` ( `title` ) VALUES ( @title ); 
SET @id = LAST_INSERT_ID();
UNLOCK TABLES;
INSERT INTO `table2` ( `parentid`, `otherid`, `userid` ) VALUES (@id, @otherid, 1); 
END

और आप इसका उपयोग कर सकते हैं ...

SET @myid;
CALL myproc( @myid, 1, "my title" );
SELECT @myid;

0

बाद में उपयोग करने के लिए php वैरिएबल में last_id_in_table1 वैरिएबल को सहेजना संभव होगा?

इस last_id के साथ मुझे इस last_id के साथ किसी अन्य तालिका में कुछ रिकॉर्ड संलग्न करने की आवश्यकता है, इसलिए मुझे इसकी आवश्यकता है:

1) एक INSERT करें और last_id_in_table1 प्राप्त करें

INSERT into Table1(name) values ("AAA"); 
SET @last_id_in_table1 = LAST_INSERT_ID();

2) किसी अन्य तालिका में किसी अनिर्धारित पंक्तियों के लिए, इन पंक्तियों को सम्मिलित करते हुए सम्मिलित में उत्पन्न last_id_insert के साथ।

$element = array(some ids)    
foreach ($element as $e){ 
         UPDATE Table2 SET column1 = @last_id_in_table1 WHERE id = $e 
    }


-1

अंतिम और दूसरे अंतिम के लिए:

INSERT INTO `t_parent_user`(`u_id`, `p_id`) VALUES ((SELECT MAX(u_id-1) FROM user) ,(SELECT MAX(u_id) FROM user  ) );

यह समाधान किसी लेन-देन (यानी ऑटोकॉमिट सक्षम) के बाहर सुरक्षित नहीं है और अंदर लेनदेन के साथ लेन-देन अलगाव स्तर से नीचे है। देखें: en.wikipedia.org/wiki/Isolation_(database_systems)
स्नोरबी

-2

बस रॉड्रिगो पोस्ट के लिए जोड़ने के लिए, LAST_INSERT_ID () के बजाय क्वेरी में आप सेलेक्ट MAX (id) FROM table1 का उपयोग कर सकते हैं;, लेकिन आपको उपयोग करना होगा ();

INSERT INTO table1 (title,userid) VALUES ('test', 1)
INSERT INTO table2 (parentid,otherid,userid) VALUES ( (SELECT MAX(id) FROM table1), 4, 1)

यह समाधान किसी लेन-देन (यानी ऑटोकॉमिट सक्षम) के बाहर सुरक्षित नहीं है और अंदर लेनदेन के साथ लेन-देन अलगाव स्तर से नीचे है। देखें: en.wikipedia.org/wiki/Isolation_(database_systems)
snorbi

-9

यदि आपको mysql से, आपकी क्वेरी के बाद, किसी अन्य क्वेरी के बिना अंतिम ऑटो-वृद्धिशील आईडी की आवश्यकता है, तो अपने कोड में डालें:

mysql_insert_id();

15
Mysql_

cletus को 106 अपवोट मिले और यहाँ mysql_insert_id के लिए उत्तर दिया गया: stackoverflow.com/a/897361/153923
jp2code

2
2009 में cletus ने इसे answeed किया! mysql को mysqli और mysqli_insert_id का उपयोग करने के लिए बेहतर ढंग से चित्रित किया गया है ।2.php.net
Maciej Paprocki

2
लुका, यदि आप इस पुराने उत्तर को हटा देंगे, तो मुझे विश्वास है कि आपकी प्रतिष्ठा वापस आ जाएगी।
टेकब्रैट

पदावनत सुझाव का दूसरा वैध विकल्प PDO :: lastInsertId ( php.net/manual/en/pdo.lastinsertid.php )
w5m
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.