LAST_INSERT_ID()MySQL


151

我有一个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();

如您所知,当前代码将仅返回table2的LAST INSERT ID而不是table1,即使我插入到table2之间,也如何从table1获取ID?

Answers:


248

您可以将最后一个插入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);    

或获取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;   

5
谢谢!当我在MySQL上使用asp.net时,我没有使其首先工作,并且需要在连接字符串中添加Allow User Variables = True来允许变量。
马丁2010年

114
max不是一个好主意,因为您可能会输掉另一个插入器。
罗伯·史达琳

5
@RobStarling我完全同意,但万一有人绝对需要它,使用具有适当隔离级别的事务。
Aidiakapi 2013年

8
如果同时发生2次或一次又一次发生插入该怎么办?
FosAvance

32
@FosAvance LAST_INSERT_ID()是特定于连接的参考
Momin Al Aziz

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
在交易中表现不错。
Kurt Van den Branden

但是:仅在InnoDB上可用。
引发者

4

我在bash中遇到了同样的问题,并且正在执行以下操作:

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-command连接每个命令。您可以使用连接mysql命令到服务器,然后插入您的疑问,或者您可以创建一个文本文件,你将mysql与来自txt文件又名重定向命令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'];

}

这将从数据库中检索最后一个ID。


1
我必须给出一个有效的示例,因此我使用了我所使用的示例。如果我用C做到这一点,您可能会抱怨“不是每个人都使用C” ...
sspence65 '31

可能是最安全和最简单的方法;)
Anjana Silva

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

可以将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 
    }


-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

只需为Rodrigo帖子添加内容,而不是在查询中使用LAST_INSERT_ID(),就可以使用SELECT 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

-9

如果您需要从mysql获取查询,请在查询后输入没有其他查询的最后一个自动递增ID,将您的代码放入:

mysql_insert_id();

15
不推荐mysql_ * -这些都是过时
德国Rumm

cletus得到了106个支持,并在此处标记了mysql_insert_id的答案:stackoverflow.com/a/897361/153923
jp2code 2013年

2
cletus在2009年对此表示敬意!最好不要使用mysqli和mysqli_insert_id ie2.php.net/mysqli_insert_id
Maciej Paprocki 2014年

2
卢卡,如果您将删除此过时的答案,我相信您的信誉分数将得到回报。
TecBrat 2014年

弃用建议的另一个有效替代方法是PDO :: lastInsertId(php.net/manual/en/pdo.lastinsertid.php
2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.