【发布时间】:2014-05-03 11:45:56
【问题描述】:
我有一个类似的查询
Insert into tbl(str)values('a'),('b'),('c')
如果我有一个插入,那么通过使用 mysqli_insert_id($con) 我可以插入最后一个 id,但是如何在这个多插入查询中插入所有 id?
【问题讨论】:
我有一个类似的查询
Insert into tbl(str)values('a'),('b'),('c')
如果我有一个插入,那么通过使用 mysqli_insert_id($con) 我可以插入最后一个 id,但是如何在这个多插入查询中插入所有 id?
【问题讨论】:
last_insert_id() 的这种行为是documented in the MySQL docs:
当前执行的语句不影响 LAST_INSERT_ID()。假设您生成一个 AUTO_INCREMENT 值 用一个语句,然后在一个语句中引用 LAST_INSERT_ID() 多行 INSERT 语句,将行插入到表中 自己的 AUTO_INCREMENT 列。 LAST_INSERT_ID() 的值将保持不变 在第二个语句中稳定;第二次及以后的价值 rows 不受早期行插入的影响。 (但是,如果你 混合引用
LAST_INSERT_ID()和LAST_INSERT_ID(expr),即 效果未定义。)
如果你真的需要它,你可以使用 foreach 和 array_push 来测试它
<?php
$InsetQueryArray = array(
"Insert into tbl(str) values('a')",
"Insert into tbl(str) values ('b')",
"Insert into tbl(str) values('c')"
);
$allLasIncrementIds = array();
foreach ($InsetQueryArray as $value) {
//execute it mysql
//Then use array_push
array_push($allLastIncrementIds, mysqli_insert_id($con));
}
?>
【讨论】:
foreach(){ mysqli_query(insert into ...) //3 times a,b and c }之间有什么区别
如果只是几行,您可以切换到使用 last_insert_id() 发送单个插入。否则,它会显着减慢您的应用程序。你可以为这些批量插入做一个标记,它被设置为一个数字,在批量插入本身上标识这个批量插入,你可以稍后获取这些 id:
insert into tbl (stuff, tmp_marker) values ("hi",1715),("ho",1715),("hu",1715);
select group_concat(id) from tbl where tmp_marker = 1715;
update tbl set tmp_marker=0 where tmp_marker=1715;
如果这些批量插入有意义,您还可以使用用户、时间和文件名或其他任何内容创建一个表 import_tbl,并保留 1715 作为对该导入的引用。
编辑:经过讨论,我会去一个导入表
CREATE TABLE import (id int(11) not null auto_increment primary key, user_id int(11), tmstmp timestamp);
当导入开始时,插入:
INSERT INTO import set user_id = $userId;
在 php 中:
$importId = last_insert_id();
$stmt = "insert into tbl (str, import_id) values ('a',$import_id), ('b', $import_id),('c',$importId);
然后你可以用你最近导入的行的 id 做任何你想做的事情。
我还没有研究是否保证多行插入会导致连续的 ID 行,因为假设 last_insert_id() 和 num_rows 的组合。如果情况一直如此,即使 MySQL 增加了并行化。所以我认为依赖它是危险的。
【讨论】: