Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取最后插入的ID mysql php的数组_Php_Mysql_Arrays - Fatal编程技术网

获取最后插入的ID mysql php的数组

获取最后插入的ID mysql php的数组,php,mysql,arrays,Php,Mysql,Arrays,我有一个类似的问题 插入tbl(str)值('a')、('b')、('c') 如果我只有一个insert,那么通过使用mysqli\u insert\u id($con)我可以插入最后一个id,但是如何在这个多插入查询中插入所有id?这个last\u insert\u id()的行为是 当前执行的语句不影响 最后一个插入ID()。假设生成一个自动增量值 使用一条语句,然后引用 多行INSERT语句,用于将行插入到具有 自己的自动增量列。最后一个\u INSERT\u ID()的值将保持不变 第二

我有一个类似的问题
插入tbl(str)值('a')、('b')、('c')


如果我只有一个insert,那么通过使用
mysqli\u insert\u id($con)
我可以插入最后一个id,但是如何在这个多插入查询中插入所有id?

这个
last\u insert\u id()的行为是

当前执行的语句不影响 最后一个插入ID()。假设生成一个自动增量值 使用一条语句,然后引用 多行INSERT语句,用于将行插入到具有 自己的自动增量列。最后一个\u INSERT\u ID()的值将保持不变 第二句话稳定;它对于第二个和更高版本的值 行不受早期行插入的影响。(不过,如果你 混合引用
LAST\u INSERT\u ID()
LAST\u INSERT\u ID(expr)
,即 效果未定义。)

如果您确实需要它,可以使用foreach和array\u 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));

}

?>

如果只是几行,您可以切换到发送带有最后一个插入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\u 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,就像假定最后一行插入和num行的组合一样。如果这种情况持续下去,即使MySQL增加了并行化。所以我认为依赖它是危险的。

但这会影响性能吗?使服务器速度太慢?您的查询与
foreach(){mysqli_查询(插入到…//3次a、b和c}
从php发送数千个单独的查询,而不是3个长的插入到。。。值(),(),。。。速度肯定要慢得多。我使用了上次的插入id()和行计数(),效果很好。这些方法行吗?我认为依赖一堆ID有点脏,但只要它有效就行。如果您认为“导入”(或从何处获取数据)是一个实体,请使用导入表。我不确定当insert语句中断或使用您的方法停止时会发生什么情况。如果一个用户插入行,我使用我的方法计算ID,突然另一个用户同时插入,那么两个用户插入的ID会混合吗?还是一块接一块地插入?是的,问得好。我希望它是一个接一个的查询,但是您应该使用脚本来尝试。我不知道是否在查询中插入20行或2000行。我更喜欢我的方式,因为这只需要稍微多做一点工作,而且我可以将插入用户、时间等存储在“导入”表中。但这并不意味着稍微简单一点的选择是错误的。这个id列表有多重要?如果系统弄混了什么,会出什么问题?非常重要!系统被扰乱了!有没有可能搞混?