Получить insert_id для всех строк, вставленных в один запрос mysqli (несколько значений)

Работа в 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;

Приведенный выше код выполняет вставку, но дает только идентификатор первой вставки после вызова. Как я могу получить все идентификаторы для этого одного запроса?

2

Решение

Можно с уверенностью предположить, что ваши идентификаторы mysql_insert_id + следующие 3 (что угодно) подряд, так как ваше заявление выполняется в одной транзакции

2

Другие решения

Нет, это невозможно с MySQL.

Его даже не реально сохранить в использовании LAST_INSERT_ID() поскольку он вернет BIGINT (64-битное) значение, представляющее первое автоматически сгенерированное значение, успешно вставленное для столбца AUTO_INCREMENT.

Вы можете догадаться, что это значение + длина вашего списка данных будет идентификатором, но нет абсолютной гарантии, что это всегда будет так.

1

Как @thomas указал, Я использовал это решение и предположил, что все в порядке, чтобы обнаружить последний идентификатор вставки;

$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;
0
По вопросам рекламы [email protected]