LAST_INSERT_ID()MySQL

Mar*_*tin 139 mysql insert last-insert-id

我有一个MySQL问题,我认为一定很容易.当我运行以下MySql查询时,我需要从table1返回LAST INSERTED 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();
Run Code Online (Sandbox Code Playgroud)

您可以理解当前代码只返回table2的LAST INSERT ID而不是table1,即使我插入table2之间,如何从table1获取id?

Jul*_*rau 232

您可以将最后一个插入ID存储在变量中:

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);    
Run Code Online (Sandbox Code Playgroud)

或者获取最大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;   
Run Code Online (Sandbox Code Playgroud)

  • max不是一个好主意,因为你可能会失去与另一个插入器的比赛. (107认同)
  • @FosAvance LAST_INSERT_ID()是特定于连接的[参考](http://stackoverflow.com/a/14827987/1363495) (31认同)
  • 如果2个I​​NSERTS同时或一个又一个发生怎么办? (7认同)
  • 谢谢!因为我使用带有MySQL的asp.net并且需要在连接字符串中添加允许用户变量= True以允许变量,所以我没有首先使用它. (5认同)
  • @RobStarling我完全同意,但万一有人绝对需要它; 使用具有适当隔离级别的事务. (5认同)

Art*_*oul 16

由于您实际将先前的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();
Run Code Online (Sandbox Code Playgroud)


Osp*_*pho 13

这使您可以在两个不同的表中插入一行,并创建对两个表的引用.

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;
Run Code Online (Sandbox Code Playgroud)


小智 6

我在 bash 中遇到了同样的问题,我正在做这样的事情:

mysql -D "dbname" -e "insert into table1 (myvalue) values ('${foo}');"
Run Code Online (Sandbox Code Playgroud)

效果很好:-)但是

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);"
Run Code Online (Sandbox Code Playgroud)

不工作。因为在第一个命令之后,shell将从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});"
Run Code Online (Sandbox Code Playgroud)

也许有人正在寻找解决方案 bash :-)