在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的这个单查询?
它应该是安全的假设,你的IDS是mysql_insert_id +未来3(其他)在继承,因为你的语句是在一个事务中完成
不,这是不可能与MySQL。
其甚至没有真正节省使用LAST_INSERT_ID()
因为它会返回一个表示BIGINT成功插入一个AUTO_INCREMENT列的第一个自动生成的值(64位)的值。
你能猜出你的数据列表的这个值+长度将是ID的,但没有任何绝对的保证,这将永远是正确的。
作为@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)