سؤال

لدي سؤال MySQL الذي أعتقد أنه يجب أن يكون سهلاً للغاية. أحتاج إلى إرجاع المعرف الأخير الذي تم إدراجه من Table1 عندما أقوم بتشغيل استعلام MySQL التالي:

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

كما يمكنك أن تفهم أن الكود الحالي سيعود فقط معرف الإدراج الأخير من Table2 بدلاً من Table1 ، كيف يمكنني الحصول على المعرف من Table1 حتى إذا قمت بإدراج في Table2 بين؟

هل كانت مفيدة؟

المحلول

يمكنك تخزين آخر معرف الإدراج في متغير:

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

أو احصل على max id 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;   

نصائح أخرى

نظرًا لأنك قمت بالفعل بتخزين 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();

يمكّنك ذلك من إدراج صف في جدولين مختلفين وإنشاء إشارة إلى كلا الجدولين أيضًا.

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;

واجهت نفس المشكلة في باش وأنا أفعل شيئًا كهذا:

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_ID_IN_TABLE1 في متغير PHP لاستخدامه لاحقًا؟

مع هذا Last_id ، أحتاج إلى إرفاق بعض السجلات في جدول آخر باستخدام هذا Last_id ، لذلك أحتاج إلى:

1) قم بإدراج واحصل على 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 
    }

من أجل عدم وجود حل 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;

للأخير والثاني الأخير:

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

فقط للإضافة إلى Post Rodrigo ، بدلاً من Last_Insert_ID () في الاستعلام ، يمكنك استخدام MAX (ID) من Table1 ؛ ، ولكن يجب استخدام () ،

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

ليس لدينا سوى شخص واحد يدخل السجلات ، لذلك أقوم بتنفيذ الاستعلام التالي مباشرة بعد الإدراج:

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

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

            $id = $row['id'];

}

هذا يسترجع المعرف الأخير من قاعدة البيانات.

إذا كنت بحاجة إلى الحصول على من MySQL ، بعد استفسارك ، آخر معرف تلقائي دون استفسار آخر ، وضعه في الكود الخاص بك:

mysql_insert_id();
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top