我有一个类似的查询
Insert into tbl(str)values('a'),('b'),('c')
如果我有一个插入,那么使用mysqli_insert_id($con)
我可以插入最后一个id但是如何在这个多插入查询中插入所有id?
答案 0 :(得分:2)
last_insert_id()
的此行为是documented in the MySQL docs:
当前正在执行的语句不会影响其值 LAST_INSERT_ID()。假设您生成AUTO_INCREMENT值 使用一个语句,然后在a中引用LAST_INSERT_ID() 多行INSERT语句,用于将行插入表中 拥有AUTO_INCREMENT列。 LAST_INSERT_ID()的值将保留 在第二个陈述中稳定;它的价值为第二个及以后 行不受先前行插入的影响。 (但是,如果你 混合对
LAST_INSERT_ID()
和LAST_INSERT_ID(expr)
的引用 效果未定义。)
如果您确实需要它,可以使用foreach with 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));
}
?>
答案 1 :(得分:0)
如果只是几行,您可以切换到使用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增加了并行化。所以我认为依赖它是危险的。