获取INSERT_ID用于插入单一的mysqli查询中的所有行(多值)(Get insert_id

2019-07-28 13:53发布

在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的这个单查询?

Answer 1:

它应该是安全的假设,你的IDS是mysql_insert_id +未来3(其他)在继承,因为你的语句是在一个事务中完成



Answer 2:

不,这是不可能与MySQL。

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

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



Answer 3:

作为@thomas 指出 ,我用这个解决方案,并假设它的确定,检测最后插入的ID;

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

在您的情况(对所有IDS);

$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;


文章来源: Get insert_id for all rows inserted in single mysqli query (multiple values)