Работа в 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;
Приведенный выше код выполняет вставку, но дает только идентификатор первой вставки после вызова. Как я могу получить все идентификаторы для этого одного запроса?
Можно с уверенностью предположить, что ваши идентификаторы mysql_insert_id + следующие 3 (что угодно) подряд, так как ваше заявление выполняется в одной транзакции
Нет, это невозможно с MySQL.
Его даже не реально сохранить в использовании LAST_INSERT_ID()
поскольку он вернет BIGINT (64-битное) значение, представляющее первое автоматически сгенерированное значение, успешно вставленное для столбца AUTO_INCREMENT.
Вы можете догадаться, что это значение + длина вашего списка данных будет идентификатором, но нет абсолютной гарантии, что это всегда будет так.
Как @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;