我如何插入多个行到MySQL表中并返回新的ID?

通常我可以在MySQL表中插入一行,并返回last_insert_id 。 现在,我想批量插入表中的许多行并取回一个ID数组。 有谁知道我怎么能做到这一点?

还有一些类似的问题,但不完全相同。 我不想插入新的ID到任何临时表; 我只想取回ID数组。

我可以从批量插入检索lastInsertId吗?

Mysql多行插入select语句与last_insert_id()

旧的线程,但只是看着这个,所以在这里:如果你在最新版本的MySQL上使用InnoDB,你可以使用LAST_INSERT_ID()和ROW_COUNT()获得ID列表。

只要innodb_autoinc_lock_mode设置为0(传统)或1(连续),InnoDB在进行批量插入时保证AUTO INCREMENT的序列号。 因此,您可以从LAST_INSERT_ID()获取第一个 ID, 最后通过添加ROW_COUNT() – 1。

我能想到的唯一方法就是如果你为每一行插入(guid)存储一个唯一的标识符,然后select行ID。 例如:

 INSERT INTO t1 (SELECT col1,col2,col3,'3aee88e2-a981-1027-a396-84f02afe7c70' FROM a_very_large_table); COMMIT; SELECT id FROM t1 WHERE guid='3aee88e2-a981-1027-a396-84f02afe7c70'; 

你也可以使用uuid()在数据库中生成guid

让我们假设我们有一个叫做temptable的表,带有两个cols uid,col1,其中uid是一个自动增量字段。 做下面的事情会返回所有插入的id在结果集中。 你可以遍历结果集并得到你的id。 我意识到这是一个旧的post,这个解决scheme可能不适用于每一个案例。 但对于其他人来说,这可能是我为什么要回复它的原因。

 # lock the table lock tables temptable write; #bulk insert the rows; insert into temptable(col1) values(1),(2),(3),(4); #get the value of first inserted row. when bulk inserting last_insert_id() #should give the value of first inserted row from bulk op. set @first_id = last_insert_id(); #now select the auto increment field whose value is greater than equal to #the first row. Remember since you have write lock on that table other #sessions can't write to it. This resultset should have all the inserted #id's select uid from temptable where uid >=@first_id; #now that you are done don't forget to unlock the table. unlock tables; 

我想你将不得不在你的应用程序中处理事务ID,或者在你的应用程序中使用项目ID来完成这个工作。

假设所有的插入都成功(!),可以这样做的一种方法是:

然后,您可以获取插入的ID与循环的受影响的行数,从lastid(这是批量插入的第一个插入的ID)开始。 因此,我检查它的工作完美..只是要小心,例如HeidiSQL将不会返回ROW_COUNT()的正确值,可能是因为它是一个糟糕的GUI做随机的狗屎,我们不问它 – 但是这是完全正确的命令行或PHP mysqli –

 START TRANSACTION; BEGIN; INSERT into test (b) VALUES ('1'),('2'),('3'); SELECT LAST_INSERT_ID() AS lastid,ROW_COUNT() AS rowcount; COMMIT; 

在PHP中,它看起来像这样(local_sqle是直接调用mysqli_query,local_sqlec是调用mysqli_query +将结果集转换为PHP数组):

 local_sqle("START TRANSACTION; BEGIN; INSERT into test (b) VALUES ('1'),('2'),('3');"); $r=local_sqlec("SELECT LAST_INSERT_ID() AS lastid,ROW_COUNT() AS rowcount;"); local_sqle(" COMMIT;"); $i=0; echo "last id =".($r[0]['lastid'])."<br>"; echo "Row count =".($r[0]['rowcount'])."<br>"; while($i<$r[0]['rowcount']){ echo "inserted id =".($r[0]['lastid']+$i)."<br>"; $i++; } 

查询被分开的原因是因为我不会使用我自己的函数得到我的结果,如果你用标准函数做这个,你可以把它放回一个语句,然后检索你需要的结果(它应该是结果编号2 – 假设您使用处理多个结果集/查询的扩展)。

 $query = "INSERT INTO TABLE (ID,NAME,EMAIL) VALUES (NULL,VALUE1, VALUE2)"; $idArray = array(); foreach($array as $key) { mysql_query($query); array_push($idArray, mysql_insert_id()); } print_r($idArray);