3

在 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?

4

3 回答 3

4

假设您的 id 是 mysql_insert_id + 接下来的 3 个(无论如何)应该是安全的,因为您的语句是在一个事务中完成的

于 2013-03-27T16:32:23.917 回答
1

不,这对于 MySQL 是不可能的。

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

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

于 2013-03-27T16:33:22.853 回答
0

正如@thomas指出的那样,我使用了这个解决方案并假设可以检测到最后一个插入ID;

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

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

$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;
于 2015-02-26T20:22:11.653 回答