【问题标题】:How to retrieve all last inserted rows IDs in mysql-php? [closed]如何在 mysql-php 中检索所有最后插入的行 ID? [关闭]
【发布时间】:2013-04-01 21:46:22
【问题描述】:

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

谢谢

【问题讨论】:

  • 所以你的 id 是自动递增的
  • 这有什么问题?应该可以正常工作。
  • 在您的批次获得最大 ID 之前。在您的批次获得最大 ID 之后。现在你知道范围了。
  • @silentboy:是的,自动递增。
  • 附注:mysql_* 函数正在被弃用,将从未来的 PHP 版本中删除。您不应该使用它们来编写新代码。请改用mysqli_* 函数或 PDO 对象。

标签: php mysql last-insert-id


【解决方案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查询。

【讨论】:

  • 您指向的是 $ids 变量。但是,即使您按照 leevi 代码打印 $id,它也应该是所有 id。
  • @silentboy:正如你所说,实际上没有错,但我只是好奇这是否有效......
  • @SureshKamrushi 看看 OP 的代码。 $ids = array() 在那里做什么。他把$ids全部放在$id数组中。那是错误
  • @leevi 你有什么错误吗?我的代码没有问题。
  • @silentboy:他初始化并使用不同的变量,但即使 $id 必须包含所有 id。 PHP 不需要变量初始化。
【解决方案2】:

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

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

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

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

顺便说一句,不要再使用 mysql_ 扩展,它已被弃用,改用 mysqli 或 pdo

【讨论】:

  • 感谢您的回复。实际上,我正在考虑自动增量方面的有效解决方案。仅供参考:我知道 mysql_ 扩展并在我的实际代码中使用了 mysqli_ 。谢谢:)
  • 一个想法是在插入中添加日期时间或时间戳,获取最后插入的 id 的日期时间,并使用该日期时间查询所有 id。
【解决方案3】:

如果您的 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

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

【讨论】:

  • 如果有其他任何东西发出插入数据库的请求,这将是不准确的——如果两个用户加载了相同的页面/请求,就会出现这种情况——如果这不是一个因素,可能会起作用。但是,在这种情况下,为什么不简单地运行第一个查询 - 两次。 range($firstMax, $lastMax) - 将提供所有 ID。即使范围很大,也可以工作。
  • 我会在第一次插入后运行第一个查询。如果你在第一次插入之前这样做,如果有人删除了最后的一些行和自动增量!= max(id)!!
  • @AD7six 是的,你是对的。我还没有考虑过从其他来源插入行的可能性。
【解决方案4】:

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

【讨论】:

    【解决方案5】:

    获取最后插入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);
    }
    

    【讨论】:

    • -1 这看起来像是问题中代码的副本 - 有错字
    • @AD7six:我使用了相同的代码,但修改了 mysql_insert_id($conn) 而不是 mysql_insert_id。由于我是stackoverflow的新手,所以我想,分享完整的例子会很好。如果您知道如何分享此类示例,请告诉我。
    • If the link identifier is not specified, the last link opened by mysql_connect() is assumed - 即在代码中添加$conn 不会改变它的工作方式。将 $ids 更改为 $id 仅意味着一个新变量具有所有 id 而不是 OP 所期望的。
    • 好的。但只有当我将 $conn 添加到 mysql_insert_db 时它才对我有用。感谢提供链接,我会通过这个。
    猜你喜欢
    • 2013-04-24
    • 2016-07-10
    • 2015-09-30
    • 1970-01-01
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    • 2011-09-08
    • 1970-01-01
    相关资源
    最近更新 更多