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

时间:2014-05-03 11:45:57

标签: php mysql arrays

我有一个类似的查询 Insert into tbl(str)values('a'),('b'),('c')

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

2 个答案:

答案 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增加了并行化。所以我认为依赖它是危险的。