Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/242.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 获取在单个mysqli查询中插入的所有行的insert_id(多个值)_Php_Mysql_Mysqli_Mysql Insert Id - Fatal编程技术网

Php 获取在单个mysqli查询中插入的所有行的insert_id(多个值)

Php 获取在单个mysqli查询中插入的所有行的insert_id(多个值),php,mysql,mysqli,mysql-insert-id,Php,Mysql,Mysqli,Mysql Insert Id,使用PHP和MYSQLI。尝试获取从具有多个值的单个insert查询插入的所有行的insert\u id。将其保持在一次呼叫中以提高效率。我的实际代码在一个insert查询中有数百个值。但是,以下是仅包含4个值的insert的一些示例代码: $sql = "INSERT INTO link_tags ( string_names_id, urls_id ) VALUES ( '2', '17' ), ( '8', '31' ), ( '8', '1' ), ( '8', '4' )";

使用PHP和MYSQLI。尝试获取从具有多个值的单个insert查询插入的所有行的insert\u id。将其保持在一次呼叫中以提高效率。我的实际代码在一个insert查询中有数百个值。但是,以下是仅包含4个值的insert的一些示例代码:

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

可以安全地假设您的ID是mysql\u insert\u ID+接下来的3个(无论什么),因为您的语句是在一个事务中完成的

不,这在mysql中是不可能的

使用
LAST\u INSERT\u ID()
甚至不能真正保存,因为它将返回一个BIGINT(64位)值,表示为自动增量列成功插入的第一个自动生成的值

您可以猜测数据列表的这个值+长度将是ID,但没有任何绝对保证这将始终是真的。

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

$id = $link->insert_id;
if ($id && $link->affected_rows > 1) {
    $id = ($id + $link->affected_rows) - 1; // sub first id num
}
在您的情况下(适用于所有ID)


据我所知,你不能使用批量插入。他们使用自动增量吗?是的。这就是答案。只需要使用第一个insert_id,并根据自动增量获取其他id。谢谢史蒂夫,你能解释一下“没有任何绝对的保证这永远是真的”吗?根据我对批插入的理解,即使在同一数据库上同时发生其他插入,MySQL也会单独处理调用。因此,如果我在一个调用中插入40个,那么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);
}
while ($link->more_results() && $link->next_result()) $ids[] = $link->insert_id;