如何在mysql-php中检索所有最后插入的行ID?

时间:2013-04-10 07:12:44

标签: php mysql last-insert-id

有没有什么有效的方法可以使用php从mysql数据库中检索所有最后插入的行自动递增的ID?假设我不知道批量中要插入多少行,但插入后我需要所有ID。

谷歌搜索后我没有找到任何有效的方法,所以我不确定是否可能。我可以遵循这个,但必须多次命中数据库以检索ID。

$data = array (
array(1,2),
array(3,4),
array(5,6)
);

$ids = array();

foreach ($data as $item) {
   $sql = 'insert into table (a,b) values ('.$item[0].','.$item[1].')';
   mysql_query ($sql);
   $ids[] = mysql_insert_id();
}

谢谢

5 个答案:

答案 0 :(得分:1)

您的代码已接近完全解决方案。

$data = array (
array(1,2),
array(3,4),
array(5,6)
);

$ids = array();

foreach ($data as $item) {
   $sql = "INSERT INTO `table` (`a`, `b`) VALUES ('{$item[0]}' ,'{$item[1]}');";
   mysql_query ($sql) or mysql_error();
   $ids[] = mysql_insert_id();
}

var_dump($ids);

如果问题是关于性能问题,那么另一种解决方案可能是

foreach ($data as $item) {
   $sql = "INSERT INTO `table`.`table` (`a`, `b`) VALUES ('{$item[0]}' ,'{$item[1]}');";
   mysql_query ($sql) or mysql_error();
}

$last_id = mysql_insert_id();
$total = count($data);
for($i = 0; $i <= $total; $i++){
    $ids[] = $total-$i;
}

这将阻止多个SQL查询。

答案 1 :(得分:1)

Mysql只返回最后插入的id,不幸的是,没有办法检索所有这些(直接)。您将不得不使用解决方法,例如:

  1. 计算插入的行和最后插入的ID,然后向后计算其余部分。

  2. 生成自定义ID,而不是让mysql以递增方式创建它们,如果插入查询成功,则将id存储到数组中(通常,如果其中一个失败,整个查询将会无论如何都失败了。

  3. 建议使用第二种方法,因为对于n1,如果你正在进行复杂的操作,例如使用INSERT blah blah ON DUPLICATE KEY,则修改将计为2个插入(不要问我为什么)而不是一个,你必须做一些计算才能看到实际插入的数量和修改的数量。

    顺便说一下,停止使用mysql_扩展,不推荐使用mysqli或pdo

答案 2 :(得分:0)

如果你的auto_incremented字段是“normal”,那么它不会以某种特殊的方式运行,但是将最后一个id增加一个,你可以在插入之前找到它的最大值,然后查找其中更高的所有记录

示例:

$sql = "SELECT id FROM table ORDER BY id DESC LIMIT 1";
    // get maximal value before insert

$sql = "SELECT id FROM table WHERE id > :last_id"; // get all new

但是这个解决方案并不专业。

答案 3 :(得分:0)

当我需要跟踪输入的批次记录时,我在表格中有一个额外的字段,通常标记为印章或其他内容。插入记录后,将使用time()函数给出的当前时间戳填充戳记字段。然后,无论它们多大,都可以跟踪每个批次。此外,保存时间戳是获取添加时间的简单方法。

答案 4 :(得分:-1)

获取上次插入ID的ID

    <?php

$conn = mysql_connect('localhost', 'user', 'password');

mysql_select_db('test');

$data = array (
array(1,2),
array(3,4),
array(5,6)
);

$ids = array();

foreach ($data as $item) {

   $sql = 'insert into testtable (a,b) values ('.$item[0].','.$item[1].')';   
   mysql_query ($sql, $conn);
   $id[] = mysql_insert_id($conn);
}