【问题标题】:Get insert_id for all rows inserted in single mysqli query (multiple values)获取在单个 mysqli 查询中插入的所有行的 insert_id(多个值)
【发布时间】:2013-03-27 16:20:17
【问题描述】:

在 PHP 中工作并使用 MYSQLI。尝试获取从具有多个值的单个插入查询插入的所有行的 insert_id。保持在一个单一的呼叫效率。我的实际代码在一个插入查询中有数百个值。但是,这里有一些示例代码,用于仅包含 4 个值的插入:

$sql = "INSERT INTO link_tags ( string_names_id, urls_id ) 
    VALUES ( '2', '17' ), ( '8', '31' ), ( '8', '1' ), ( '8', '4' )";

$mysqli->query($sql);

echo "id's: " .$mysqli->insert_id;

上面的代码实现了插入,但只给了我调用中第一个插入的 id。如何检索此单个查询的所有 ID?

【问题讨论】:

  • 据我所知,你不能使用批量插入来做到这一点。
  • 他们使用自动增量吗?
  • 是的。这就是答案。只需要使用第一个 insert_id 并根据自动增量获取其他的。谢谢!

标签: php mysql mysqli mysql-insert-id


【解决方案1】:

假设您的 ids 是 mysql_insert_id + 接下来的 3 个(随便)应该是安全的,因为您的语句是在一个事务中完成的

【讨论】:

    【解决方案2】:

    不,这在 MySQL 中是不可能的。

    使用LAST_INSERT_ID() 甚至没有真正节省,因为它会返回一个 BIGINT(64 位)值,表示为 AUTO_INCREMENT 列成功插入的第一个自动生成的值。

    您可能会猜到这个值 + 数据列表的长度将是 ID,但没有任何绝对保证这总是正确的。

    【讨论】:

    • Steve,您能否详细说明“没有任何绝对保证这将永远是正确的”?根据我对批量插入的理解,即使同一数据库上同时发生其他插入,MySQL 也会单独处理调用。因此,如果我在一次调用中进行 40 次插入,则 ID 将根据该一次调用自动递增,对吗?
    【解决方案3】:

    作为@thomas pointed,我使用了这个解决方案并假设可以检测到最后一个插入ID;

    $id = $link->insert_id;
    if ($id && $link->affected_rows > 1) {
        $id = ($id + $link->affected_rows) - 1; // sub first id num
    }
    

    在您的情况下(适用于所有 id);

    $id = $link->insert_id; $ids = [$id];
    if ($id && $link->affected_rows > 1) {
        for ($i = 0; $i < $link->affected_rows - 1; $i++) {
            $ids[] = $id + 1;
        }
    }
    
    // or more dirty way
    $id = $link->insert_id; $ids = [$id];
    if ($id && $link->affected_rows > 1) {
        $ids = range($id, ($id + $link->affected_rows) - 1);
    }
    

    同时,我使用multi_query并在while循环中处理了结果,但无法达到预期的结果。

    while ($link->more_results() && $link->next_result()) $ids[] = $link->insert_id;
    

    【讨论】:

      猜你喜欢
      • 2013-05-08
      • 1970-01-01
      • 2017-08-28
      • 2013-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多