6

有没有任何有效的方法可以使用 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();
}

谢谢你

4

5 回答 5

1

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

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

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

推荐使用第二种方法,因为对于 n1,如果您正在执行稍微复杂的操作,例如使用INSERT blah blah ON DUPLICATE KEY修改将计为 2 次插入(不要问我为什么)而不是 1 次,并且您必须进行一些计算才能了解如何实际上插入了很多,修改了多少。

顺便说一句,停止使用 mysql_ 扩展名,它已被弃用,改用 mysqli 或 pdo

于 2013-04-10T07:33:10.160 回答
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查询。

于 2013-04-10T07:20:36.860 回答
0

如果您的 auto_incremented 字段是“正常”的,因此它不会以某种特殊方式表现,而是将最后一个 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

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

于 2013-04-10T07:17:12.340 回答
0

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

于 2013-04-10T07:39:07.260 回答
-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);
}
于 2013-04-10T07:37:24.110 回答