LAST_INSERT_ID () মাইএসকিউএল


151

আমার একটি মাইএসকিউএল প্রশ্ন রয়েছে যা আমি মনে করি এটি অবশ্যই খুব সহজ হবে। আমি নিম্নলিখিত মাইএসকিএল কোয়েরিটি চালানোর সময় আমাকে টেবিল 1 থেকে সর্বশেষ সংযুক্ত IDটি ফিরিয়ে আনতে হবে:

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);    

অথবা সর্বোচ্চ আইডি ফ্রিম টেবিল 1 পান 1

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
ধন্যবাদ! আমি মাইএসকিউএল এর সাথে এসপ নেট ব্যবহার করছিলাম এবং ভেরিয়েবলগুলিকে অনুমতি দেওয়ার জন্য সংযুক্তি স্ট্রিংয়ের সাথে ইউজার ভেরিয়েবলগুলি = সত্য যুক্ত করার দরকার ছিল বলে আমি এটি প্রথম কাজ করতে পারি নি।
মার্টিন

114
সর্বোচ্চ কোনও ভাল ধারণা নয়, কারণ আপনি অন্য সন্নিবেশকের সাথে প্রতিযোগিতা হারাতে পারেন।
রব স্টার্লিং

5
@ রবস্টার্লিং আমি সম্পূর্ণরূপে একমত, তবে কারওর যদি একেবারে প্রয়োজন হয়; সঠিক বিচ্ছিন্নতা স্তরের সাথে একটি লেনদেন ব্যবহার করুন।
এইডিয়াকাপি

8
যদি 2 ইনসার্ট একই সাথে বা একের পর এক সুখে থাকে?
FosAvance

32
@ ফোস অ্যাভান্স লাসT_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
তবে: কেবল ইনোডিবিতে উপলব্ধ।
19-29

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 ফাইল থেকে পুনর্নির্দেশের সাথেmysql [connection option] < txt.file
raiserle

1

আমাদের কেবলমাত্র একজন ব্যক্তি রেকর্ডে প্রবেশ করছে, সুতরাং আমি queryোকানোর পরে অবিলম্বে নিম্নলিখিত কোয়েরিটি সম্পাদন করি:

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

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

            $id = $row['id'];

}

এটি ডাটাবেস থেকে শেষ আইডি পুনরুদ্ধার করে।


1
আমাকে একটি বৈধ উদাহরণ দিতে হয়েছিল, তাই আমি যেটি ব্যবহার করি তা ব্যবহার করেছি। আমি যদি এটি সি তে করতাম তবে আপনি সম্ভবত অভিযোগ করতেন "" প্রত্যেকে সি ব্যবহার করে না "....
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

শেষের_আইডি_ইন_টিটেবল 1 ভেরিয়েবলটি এটি পরে ব্যবহার করার জন্য পিএইচপি ভেরিয়েবলে সংরক্ষণ করা সম্ভব হবে?

এই লাস্ট_আইডের সাথে আমার এই লাস্ট_আইডের সাথে অন্য টেবিলে কিছু রেকর্ড সংযুক্ত করতে হবে, তাই আমার প্রয়োজন:

1) একটি INSERT করুন এবং সর্বশেষ_আইড_ইন_ টেবিল 1 পান

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

2) অন্য টেবিলের যেকোন অনির্দিষ্ট সারির জন্য, সন্নিবেশের মধ্যে উত্পাদিত শেষ_আইড_সিন্টের সাহায্যে এই সারিগুলি আপলোড করুন।

$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  ) );

এই সমাধানটি কোনও লেনদেনের বাইরে নিরাপদ নয় (অর্থাত্‍ স্বায়ত্তশক্তি সক্ষম) এবং লেনদেনের ভিতরে লেনদেনের পৃথকীকরণের স্তর পৃথকীকরণযোগ্য স্তর। দেখুন:
এন.ইউইকিপিডিয়া.আর.উইকি

-2

সবেমাত্র রডরিগো পোস্টের জন্য যুক্ত করতে, ক্যোয়ারিতে LAST_INSERT_ID () এর পরিবর্তে আপনি সারণী ম্যাক্স (আইডি) ব্যবহার করতে পারেন টেবিল 1 থেকে ;, তবে আপনাকে অবশ্যই ব্যবহার করতে হবে (),

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

এই সমাধানটি কোনও লেনদেনের বাইরে নিরাপদ নয় (অর্থাত্‍ স্বায়ত্তশক্তি সক্ষম) এবং লেনদেনের ভিতরে লেনদেনের পৃথকীকরণের স্তর পৃথকীকরণযোগ্য স্তর। দেখুন:
এন.ইউইকিপিডিয়া.আর

-9

আপনার কোয়েরির পরে যদি আপনার মাইএসকিএল থেকে আপনার দরকার হয় তবে আপনার কোডটিতে অন্য কোনও জিজ্ঞাসা ছাড়াই শেষ স্বতঃবৃদ্ধিযোগ্য আইডি রয়েছে:

mysql_insert_id();

15
মাইএসকিএল_ * - এর সুপারিশ করবেন না - এগুলি অবমূল্যায়ন করা হয়েছে
জার্মান রম্ম

cletus 106 upvotes উঠে জন্য উত্তর হিসাবে চিহ্নিত mysql_insert_id : এখান stackoverflow.com/a/897361/153923
jp2code

2
ক্লিটাস ২০০৯ সালে এর জবাব দিল! mysqli এবং mysqli_insert_id ie2.php.net/mysqli_insert_id
Maciej পাপ্রোকি

2
লুকা, আপনি যদি এই পুরানো উত্তর মুছে ফেলেন তবে আমি বিশ্বাস করি আপনার খ্যাতি পয়েন্টগুলি ফিরে আসবে।
টেকব্র্যাট

অবহেলিত পরামর্শের আর একটি বৈধ বিকল্প হ'ল পিডিও :: সর্বশেষInsertId ( php.net/manual/en/pdo.lastinsertid.php )
w5m
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.